我有一个名为Sprite的类,而ballSprite是该类的一个实例。 Sprite有一个名为Position的Vector2属性。
我正在尝试增加Vector的X组件,如下所示:
ballSprite.Position.X++;
但它会导致此错误:
Cannot modify the return value of 'WindowsGame1.Sprite.Position' because it is not a variable
是否无法设置此类组件? X和Y字段的工具提示显示“获取或设置...”,因此我无法理解为什么这不起作用。
答案 0 :(得分:13)
问题是ballSprite.Position
返回一个结构,所以当你访问它时,它会因值语义而创建它的副本。 ++尝试修改该值,但它将修改临时副本 - 而不是存储在Sprite中的实际结构。
你必须从读取位置获取值并将其放入局部变量,更改该局部变量,然后将局部变量分配回位置,或者使用其他类似的方法(可能隐藏它)作为一些IncrementX
方法)。
Vector2D v;
v = ballSprite.Position;
v.X++;
ballSprite.Position = v;
另一种更通用的解决方案可能是将另一个Vector2添加到您的位置。 +运算符被重载,因此您可以使用所需的更改创建一个新向量,然后将其添加到向量中,而不是一次更新一个单独的组件。
答案 1 :(得分:2)
你可以做到
Position = new Vector2(Position.X + 1, Position.Y );
或
Position += new Vector2( 1.0f, 0.0f );
或
Position.X += 1.0f;
答案 2 :(得分:2)
一个简单的替代方案是:
代替:sprite.Position.X = 10;
使用:sprite.Position = new Vector2(10, sprite.Position.Y);
代替:sprite.Position.Y = 10;
使用:sprite.Position = new Vector2(sprite.Position.X, 10);
代替:sprite.Position.X += 10;
使用:sprite.Position += new Vector2(0, 10);
代替:sprite.Position.Y += 10;
使用:sprite.Position += new Vector2(10, 0);
答案 3 :(得分:0)
您无需使用new Vector2(...)
添加2个向量,也可以使用Vector2.UnitX:
ballSprite.Position.X += 1; // error
ballSprite.Position += Vector2.UnitX; // solution
当您想要移动 direction 时,它非常有用。例如,如果您只想横向移动:
Vector2 offset = new Vector2(2, 4);
ballsprite.Position += offset * Vector2.UnitX;
在此示例中,speed.Y
的值不会添加到精灵的位置。为什么呢?
offset == new Vector2(2, 4)
UnitX == new Vector2(1, 0)
--------------------------------
The above Vectors are multiplied
which results into the following
--------------------------------
offset * UnitX
(X: 2, Y: 4) * (X: 1, Y: 0)
(X: 2 * 1, ... Y: 4 * 0)
(X: 2, Y: 0) <-- result
这样做的另一个好处是可读性。至少这是我的想法。亲眼看看:
// multiple ways of incrementing ballspeeds X coordinate.
ballSprite.Position += Vector2.UnitX;
ballSprite.Position += new Vector2(1, 0);
ballSprite.Position = new Vector2(ballSprite.Position.X + 1, ballSprite.Position.Y);
Vector2 temp = ballSprite.Position;
temp.X++;
ballSprite.Position = temp;
当然,垂直运动也有Vector2.UnitY。将这些静态字段与Vector2.Zero和Vector2.One结合使用,您就可以编写易于理解的代码。
当我使用Vector2
和方向时,我使用下表:
<--- X coordinate --->
-1 0 +1
| |
-Vector2.One | -Vector2.UnitY | -1
(X:-1, Y:-1) | (X: 0, Y:-1) |
| | ^
----------------+----------------+---------------- |
| |
-Vector2.UnitX | Vector2.Zero | +Vector2.UnitX 0 Y coordinate
(X:-1, Y: 0) | (X: 0, Y: 0) | (X:+1, Y: 0)
| | |
----------------+----------------+---------------- V
| |
| +Vector2.UnitY | +Vector2.One +1
| (X: 0, Y:+1) | (X:+1, Y:+1)
| |