2010-04-20 7 views
2

Je suis en train de jouer avec des trucs dans XNA et j'essaie de déplacer un objet autour des astéroïdes en ce sens que vous appuyez sur gauche et droite pour tourner et monter/descendre pour avancer et reculer dans la direction pointent. J'ai la rotation de l'image-objet terminée, mais je ne peux pas déplacer l'objet dans la direction que vous lui avez indiquée, il se déplace toujours de haut en bas sur l'axe x = 0.XNA Vector2 Rotation Question

Je suppose que c'est simple mais je n'arrive pas à comprendre. Ma classe « navire » a les propriétés suivantes qui sont note dignes ici:

Vector2 Position 
float Rotation 

La classe « navire » a une méthode de mise à jour est l'endroit où l'entrée est traitée et jusqu'à présent, j'ai les suivantes:

public void Update(GameTime gameTime) 
{ 
    KeyboardState keyboard = Keyboard.GetState(); 
    GamePadState gamePad = GamePad.GetState(PlayerIndex.One); 

    float x = Position.X; 
    float y = Position.Y; 

    if (keyboard.IsKeyDown(Keys.Left)) Rotation -= 0.1f; 
    if (keyboard.IsKeyDown(Keys.Right)) Rotation += 0.1f; 
    if (keyboard.IsKeyDown(Keys.Up)) ??; 
    if (keyboard.IsKeyDown(Keys.Down)) ??; 

    this.Position = new Vector2(x, y); 
} 

Toute aide serait grandement appréciée!

Répondre

5

OK, voici comment je l'ai fait (je savais qu'il y aurait une solution non-trig!)

float x = Position.X; 
float y = Position.Y; 

Matrix m = Matrix.CreateRotationZ(Rotation); 

if (keyboard.IsKeyDown(Keys.Left)) Rotation -= 0.1f; 
if (keyboard.IsKeyDown(Keys.Right)) Rotation += 0.1f; 
if (keyboard.IsKeyDown(Keys.Up)) 
{ 
    x += m.M12 * 5.0f; 
    y -= m.M11 * 5.0f; 
} 
if (keyboard.IsKeyDown(Keys.Down)) 
{ 
    x -= m.M12 * 5.0f; 
    y += m.M11 * 5.0f; 
} 
+0

Bonne prise. C'est le moyen le plus approprié, étant qu'il utilise les bibliothèques de classes fournies par l'API que vous utilisez. Heureux de vous entendre l'avoir résolu – CDSO1

1

Je crois que la formule générale est

X += cos(Angle * PI/180)*Speed 
Y += sin(Angle * PI/180)*Speed 

Voici un exemple:

public partial class Form1 : Form 
    { 
     private float X = 10, Y=10; 
     private float Angle = 45f; 
     float PI = 3.141f; 


     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     {   
      X += (float)Math.Cos(Angle * PI/180.0f)*5f; 
      Y += (float)Math.Sin(Angle * PI/180.0f) * 5f; 

      button1.Top = (int)X; 
      button1.Left = (int)Y; 
     } 
    } 
+0

J'ai essayé ce qui suit, mais maintenant il semble juste de se déplacer le long de l'axe x ...: S si (keyboard.IsKeyDown (Keys.Up)) { x + = (float) Math. Cos (Rotation * Math.PI/180) * 5; y + = (flottant) Math.Sin (Rotation * Math.PI/180) * 5; } si (keyboard.IsKeyDown (Keys.Down)) { x - = (flottant) Math.Cos (Rotation * Math.PI/180) * 5; y - = (flottant) Math.Sin (Rotation * Math.PI/180) * 5; } –

2

Je sais que c'est un peu vieux, mais je suis encore à travers elle et je pensais que je voudrais ajouter ceci pour un souci d'exhaustivité.

Au lieu d'utiliser:

X += (float)Math.Cos(Angle * PI/180.0f) * 5f; 
Y += (float)Math.Sin(Angle * PI/180.0f) * 5f; 

Vous pouvez utiliser:

this.Position.X += (float)(Math.Cos(this.Angle - MathHelper.PiOver2) * 2f); 
this.Position.Y += (float)(Math.Sin(this.Angle - MathHelper.PiOver2) * 2f); 

Cela semble avoir obtenu me aller de l'avant de toute façon.

Source: this tutorial (Relier la partie 3 car elle contient des liens vers les deux premiers).

Questions connexes