2010-03-28 21 views
8

Sprite adında bir sınıfım var ve ballSprite bu sınıfın bir örneğidir. Sprite, Position adında bir Vector2 özelliğine sahiptir.XNA Vector bileşenleri değiştirilemiyor

ballSprite.Position.X++; 

ama bu hataya neden:

ben şöyle Vector'ün X bileşeni artırmak çalışıyorum

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

böyle bileşenleri ayarlamak mümkün değil midir? X ve Y alanları için ipucu "Al ya da koy ..." yazıyor, bu yüzden bunun neden çalışmadığını göremiyorum.

cevap

13

Sorun, ballSprite.Position öğesinin bir struct döndürmesidir, bu nedenle ona eriştiğinizde, değer semantikleri nedeniyle bir kopyasını oluşturur. ++ bu değeri değiştirmeye çalışır, ancak geçici bir kopyasını değiştirir - Sprite'ınızda depolanan gerçek yapıyı değil.

Değerleri Konum okuma ve yerel bir değişkene koyma, yerel değişkeni değiştirme ve ardından yerel değişkeni Konum'a yeniden atamanız veya başka bir benzer şekilde kullanmanız gerekir (belki gizleme Bazı IncrementX yöntemi olarak).

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

Başka bir daha genel çözüm, Konumunuza başka bir Vector2 eklemek olabilir. + Operatörü aşırı yüklenmiştir, böylece istediğiniz değişiklikle yeni bir vektör oluşturabilir ve ardından bu kişilere tek tek her birini güncellemek yerine vektöre ekleyebilirsiniz.

yerine:

+0

ballSprite.Position.X = ballSprite.Position.X + 1; ya çalışmıyor - aynı hata. :(Bu tam olarak aynı ballSprite.Position.X ++ ile aynı değil mi? –

+0

Üzgünüz, ben orada düz düşünmüyordum.Onu çözdüm. –

+0

Tamam, çözülmüş gibi görünüyor. Bu sorun biraz sinir bozucu. Teşekkürler, muhtemelen sadece iki vektör ekleyeceğim. :) –

2

Sen

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

veya

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

veya

Position.X += 1.0f; 
+0

Yani X ve Y alanlarının özeti bir hatadır? // // Özet: // Vektörün y bileşenini alır veya ayarlar. Her halükarda, teşekkürler! –

+0

Nope, Yanıldım, sonunda f ile bir float eklediğinizden emin olmanız gerekiyor. – Maynza

+1

ballSprite.Position.X + = 0.1f; Bu hala bana aynı hatayı veriyor. Ayrıca, hata bir tür sorundan kaynaklanmışsa, hata bu konuda bir şey söyleyecekti. –

2

Kolay bir alternatif yapabileceği budur sprite.Position.X = 10;

kullanımı: sprite.Position = new Vector2(10, sprite.Position.Y);

yerine: sprite.Position.Y = 10;

kullanımı: sprite.Position = new Vector2(sprite.Position.X, 10);

yerine: sprite.Position.X += 10;

kullanımı: sprite.Position += new Vector2(0, 10);

yerine: sprite.Position.Y += 10;

kullanım: 2 vektörleri eklemek için new Vector2(...) kullanarak yerine çıkış sprite.Position += new Vector2(10, 0);

+0

Evet, tam olarak bunu yaptığım gibi ama Vector3 ile, iyi çalışıyor gibi görünüyor. – wired00

0

, ayrıca Vector2.UnitX kullanabilirsiniz:

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

Eğer yönlü taşımak istediğinizde çok kullanışlıdır.Örneğin, yatay sadece taşımak istiyorsanız: Bu örnekte

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

, speed.Y değeri sprite pozisyona eklenmez. Niye ya?

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 

bu şekilde yapmanın bir diğer avantajı okunabilirliği olduğunu. En azından düşündüğüm bu. Kendiniz için bakınız: Elbette

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

, dikey hareketi için de bir Vector2.UnitY yoktur. Bu statik alanları Vector2.Zero ve Vector2.One ile birleştirin ve anlaşılması kolay bir kod yazabilirsiniz.

I Vector2 s ve yön ile çalışıyorum, ben aşağıdaki tablo:

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