2010-03-28 16 views
8

Tengo una clase llamada Sprite, y ballSprite es una instancia de esa clase. Sprite tiene una propiedad Vector2 llamada Posición.No se pueden modificar los componentes XNA Vector

Estoy intentando incrementar la componente X del vector, así:

ballSprite.Position.X++; 

pero causa este error:

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

¿No es posible configurar los componentes de este tipo? La información sobre herramientas para los campos X e Y dice "Obtener o establecer ..." por lo que no puedo ver por qué esto no está funcionando.

Respuesta

13

El problema es que ballSprite.Position devuelve una estructura, por lo que cuando accede a ella, crea una copia de la misma debido a la semántica del valor. ++ intenta modificar ese valor, pero modificará una copia temporal, no la estructura real almacenada en su Sprite.

Tiene que tomar el valor de leer la Posición y ponerla en una variable local, cambiar esa variable local, y luego asignar la variable local de nuevo a Posición, o usar alguna otra manera similar de hacerlo (tal vez ocultarse como un método IncrementX).

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

Otra solución, más genérica, podría ser agregar otro Vector2 a su posición. El operador + está sobrecargado, por lo que puede crear un nuevo vector con el cambio que desee y luego agregarlo al vector en lugar de actualizar los componentes indiviudal de a uno por vez.

+0

ballSprite.Position.X = ballSprite.Position.X + 1; tampoco funciona - el mismo error. :(¿No es exactamente lo mismo que ballSprite.Position.X ++ de todos modos? –

+0

Lo siento, no estaba pensando directamente allí. Lo he arreglado. –

+0

Bueno, parece que está resuelto. Este problema es un poco molesto. Gracias. Probablemente solo agregue dos vectores :) –

2

Usted puede hacer

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

o

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

o

Position.X += 1.0f; 
+0

Entonces, ¿el resumen de los campos X e Y es un error? // // Resumen: // Obtiene o establece el componente y del vector. De cualquier manera, ¡gracias! –

+0

No, estaba equivocado, solo necesita asegurarse de que está agregando un flotador con la f al final. – Maynza

+1

ballSprite.Position.X + = 0.1f; Eso todavía me da el mismo error. Además, si el error fue causado por un problema de tipo, seguramente el error diría algo al respecto? –

2

Una alternativa fácil es la siguiente:

en lugar de: sprite.Position.X = 10;

uso: sprite.Position = new Vector2(10, sprite.Position.Y);

en lugar de: sprite.Position.Y = 10;

uso: sprite.Position = new Vector2(sprite.Position.X, 10);

en lugar de: sprite.Position.X += 10;

uso: sprite.Position += new Vector2(0, 10);

en lugar de: sprite.Position.Y += 10;

uso: sprite.Position += new Vector2(10, 0);

+0

Sí, esta es exactamente la forma en que lo hago, pero con Vector3, parece funcionar bien. – wired00

0

En lugar de utilizar new Vector2(...) añadir 2 vectores, también se puede utilizar Vector2.UnitX:

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

Es muy útil cuando se desea mover direccional.Por ejemplo, si desea mover sólo horizontal:

Vector2 offset = new Vector2(2, 4); 
ballsprite.Position += offset * Vector2.UnitX; 

En este ejemplo, no se agregará el valor de speed.Y a la posición del sprite. ¿Por qué?

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 

Otra ventaja de hacerlo de esta manera es legibilidad. Al menos eso es lo que creo. Verlo por ti mismo:

// 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; 

Por supuesto, hay también un Vector2.UnitY es para el movimiento vertical. Combine estos campos estáticos junto con Vector2.Zero y Vector2.One, y puede escribir código fácil de entender.

Cuando estoy trabajando con Vector2 s e indicaciones, uso la siguiente tabla:

   <--- 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) 
       |    |     
Cuestiones relacionadas