2010-03-28 10 views
8

Ho una classe chiamata Sprite e ballSprite è un'istanza di quella classe. Sprite ha una proprietà Vector2 chiamata Position.Impossibile modificare i componenti XNA Vector

Sto cercando di incrementare X componente del vettore in questo modo:

ballSprite.Position.X++; 

ma provoca questo errore:

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

Non è possibile impostare i componenti di questo tipo? Il suggerimento per i campi X e Y dice "Get or set ..." quindi non riesco a capire perché questo non funziona.

risposta

13

Il problema è che ballSprite.Position restituisce una struttura, quindi quando ci si accede, ne crea una copia a causa della semantica del valore. ++ tenta di modificare quel valore, ma modificherà una copia temporanea, non la struttura effettiva memorizzata nel tuo Sprite.

È necessario prendere il valore dalla lettura della posizione e inserirlo in una variabile locale, modificare quella variabile locale e quindi assegnare la variabile locale indietro in Posizione oppure utilizzare un altro modo simile di farlo (nascondersi magari come metodo IncrementX).

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

Un'altra soluzione più generica potrebbe essere quella di aggiungere un altro Vector2 alla posizione. L'operatore + è sovraccarico, quindi è possibile creare un nuovo vettore con la modifica desiderata, quindi aggiungerlo al vettore anziché aggiornare i componenti singoli uno alla volta.

+0

ballSprite.Position.X = ballSprite.Position.X + 1; non funziona neanche - lo stesso errore. :(Non è esattamente uguale a ballSprite.Position.X ++ comunque? –

+0

Scusa, non stavo pensando direttamente lì. L'ho risolto. –

+0

Ok, sembra che sia risolto. Questo problema è piuttosto fastidioso Grazie, probabilmente aggiungerò due vettori :): –

2

Si può fare

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

o

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

o

Position.X += 1.0f; 
+0

Quindi il riassunto dei campi X e Y è un bug? // // Riepilogo: // Ottiene o imposta il componente y del vettore. In entrambi i casi, grazie! –

+0

No, mi sono sbagliato, devi solo assicurarti di aggiungere un float con la f alla fine. – Maynza

+1

ballSprite.Position.X + = 0,1f; Questo mi dà ancora lo stesso errore. Inoltre, se l'errore è stato causato da un problema di tipo, sicuramente l'errore avrebbe detto qualcosa al riguardo? –

2

Un facile alternativa è questa:

invece di: sprite.Position.X = 10;

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

anziché: sprite.Position.Y = 10;

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

anziché: sprite.Position.X += 10;

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

anziché: sprite.Position.Y += 10;

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

+0

Sì, è esattamente come lo faccio io ma con Vector3 sembra funzionare bene. – wired00

0

Invece di utilizzare new Vector2(...) aggiungere 2 vettori, è anche possibile utilizzare Vector2.UnitX:

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

E 'molto utile quando si desidera spostare direzionale.Per esempio, se si desidera spostare solo orizzontale:

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

In questo esempio, il valore di speed.Y non saranno aggiunti alla posizione dello sprite. Perché?

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 

Un altro vantaggio di farlo in questo modo è leggibilità. Almeno questo è quello che penso. Vedere per credere:

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

Naturalmente, c'è anche un Vector2.UnitY per il movimento verticale. Combina questi campi statici con Vector2.Zero e Vector2.One e puoi scrivere codice di facile comprensione.

Quando sto lavorando con Vector2 s e indicazioni, io uso la seguente tabella:

   <--- 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) 
       |    |     
Problemi correlati