我正在 XNA 中制作矢量图形游戏。我设计了一个 Line 类来围绕中心点旋转以帮助绘制特定形状。为了保持单一的真实性,有没有办法将对形状中心的引用传递给我创建的所有线条,以便更新中心的位置也会更新线条的位置?我认为这样的事情会起作用:
class Line
{
private Vector2 start;
private double length;
private double angle;
public Line(ref Vector2 start, double length, double angle){
this.start = start;
this.length = length;
this.angle = angle;
}
}
class Obj
{
private Vector2 center;
private Line[] lines;
public Obj(){
center = new Vector2(50,50);
lines = new Lines[5];
for (int i = 0; i < 5; i++){
lines[i] = new Line(ref center,30, (i/5 * 2 * Math.PI));
}
}
}
但是当我移动中心时线条不会更新。我做错了什么?
最佳答案
虽然 struct
是通过引用正确传递给 Line
的,但是当您在内部分配它时:
public Line(ref Vector2 start, double length, double angle){
this.start = start;
}
您实际上是在获取 struct
的副本。
如果您发现自己需要 struct
的引用类型语义而不是将其传递给单个方法,那么您可能需要重新考虑使用 class
。
您可以在类中重新实现该类型或将 Vector2
包装在类中并使用它:
class Vector2Class
{
public Vector2 Centre;
public Vector2Class(Vector2 inner)
{
Centre = inner;
}
}
class Line
{
private Vector2Class _centre;
public Line(Vector2Class centre)
{
_centre = centre;
}
}
请注意,您仍在处理一个副本,但如果您共享类(class),你们将在相同副本上工作。
就个人而言,我会避免包装器并创建我自己的类来表示“中心”。这得到了广泛接受的想法的支持,即 struct
类型应该是不可变的,但您似乎需要改变值以保持表示为真。
class CentreVector<T>
{
public <T> X { get; set; }
public <T> Y { get; set; }
}
这只会让您共享数据,实际上不会通知中心已更改的线路。为此,您需要某种事件。
关于C# XNA 在构造函数中通过引用类传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11011768/