Невозможно изменить компоненты вектора XNA - PullRequest
8 голосов
/ 29 марта 2010

У меня есть класс под названием Sprite, и ballSprite является экземпляром этого класса. Sprite имеет свойство Vector2 с именем Position.

Я пытаюсь увеличить компонент X вектора так:

ballSprite.Position.X++;

но это вызывает эту ошибку:

Cannot modify the return value of 'WindowsGame1.Sprite.Position' because it is not a variable

Разве нельзя установить такие компоненты? Всплывающая подсказка для полей X и Y гласит «Получить или установить ...», поэтому я не могу понять, почему это не работает.

Ответы [ 4 ]

13 голосов
/ 29 марта 2010

Проблема в том, что ballSprite.Position возвращает структуру, поэтому при доступе к ней создается ее копия из-за семантики значения. ++ пытается изменить это значение, но оно будет изменять временную копию, а не фактическую структуру, хранящуюся в вашем Sprite.

Вы должны взять значение из чтения Position и поместить его в локальную переменную, изменить эту локальную переменную, а затем присвоить локальную переменную обратно в Position или использовать какой-то другой, аналогичный способ (возможно, скрыть как какой-то IncrementX метод).

Vector2D v;
v = ballSprite.Position;
v.X++;
ballSprite.Position = v;

Другим, более общим решением может быть добавление еще одного Vector2 к вашей позиции. Оператор + перегружен, поэтому вы можете создать новый вектор с желаемым изменением, а затем добавить его в вектор вместо обновления отдельных компонентов по одному.

2 голосов
/ 22 июля 2012

Легкая альтернатива это:

вместо: 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);

2 голосов
/ 29 марта 2010

Вы можете сделать

 Position = new Vector2(Position.X + 1, Position.Y );

или

 Position += new Vector2( 1.0f, 0.0f );

или

 Position.X += 1.0f;
0 голосов
/ 25 января 2013

Вместо использования new Vector2(...) для добавления 2 векторов вы также можете использовать Vector2.UnitX :

ballSprite.Position.X += 1; // error
ballSprite.Position += Vector2.UnitX; // solution

Это очень полезно, когда вы хотите двигаться по направлению . Например, если вы хотите переместиться только по горизонтали:

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 s и указаниями, я использую следующую таблицу:

             <---  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)  
                |                |                
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...