我写了这样一个属性(代表我的XNA游戏对象的方向):
public Vector2 Direction
{
get { return direction; }
protected set
{
(direction = value).Normalize(); // ***
angle = MathHelper.WrapAngle((float)Math.Atan(direction.X / direction.Y));
}
}
set 设置两个等效字段,表示对象在角度中的方向,同时在规范化向量中。
开始游戏失败,因为 *** 标记的行失败。它没有规范化矢量。
我将此行更改为:
direction = value;
direction.Normalize();
它工作正常......为什么?
我假设在 *** 标记的行中,第一个操作是分配值然后标准化方向。但事实并非如此。
_ __ __ _ < / em> _ ___
Normalize()是来自 Vector2 类的方法。
//
// Summary:
// Turns the current vector into a unit vector. The result is a vector one unit
// in length pointing in the same direction as the original vector.
public void Normalize();
答案 0 :(得分:4)
我假设Vector2是一个结构或值类型,这意味着它是按值传递而不是通过引用传递。为方向指定值时,您将指向值的副本。此外,表达式返回的对象(direction = value)是一个副本,而不是方向相同的实例。您正在对从未存储在setter块之外的对象调用Normalize。
出于同样的原因,您无法在类的属性getter返回的结构上调用方法或设置属性。例如,如果示例中的属性位于名为Monkey的类中,请注意:
Monkey m = new Monkey();
m.Direction = new Vector2(...);
m.Direction.X = 2; // This will not compile.
m.Direction.Normalize(); // This will not do what you expect.