2010-04-20 43 views
2

我搞砸了XNA中的一些东西,我试图移动一个小行星式周围的物体,因为你按左右旋转和向上/向下以向前和向后的方向前进指向。XNA Vector2旋转问题

我已经完成了精灵的旋转,但我无法让对象沿着您指向的方向移动,它总是在x = 0轴上上下移动。

我猜这是直接的,但我无法弄清楚。我的“船”类具有以下性能,这是值得记在这里:

Vector2 Position 
float Rotation 

“船”类有一个更新的方法是其中输入被处理,到目前为止,我有以下几点:

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

任何帮助将不胜感激!

回答

5

好了,这里是我做到了(我知道会有一个非-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

好的。这是更合适的方式,因为它正在使用您正在使用的API提供的类库。很高兴听到你解决它 – CDSO1 2010-04-21 13:03:28

1

我相信通式为

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

下面是一个例子:

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

我试过以下,但现在它似乎只是沿x轴移动...:S 如果(keyboard.IsKeyDown(Keys.Up)){ X + =(浮动)数学。 Cos(旋转* Math.PI/180)* 5; y + =(float)Math.Sin(Rotation * Math.PI/180)* 5;如果(keyboard.IsKeyDown(Keys.Down)) x - =(float)Math.Cos(Rotation * Math.PI/180)* 5; y - =(float)Math.Sin(Rotation * Math.PI/180)* 5; } – 2010-04-20 20:53:01

2

我意识到这是有点旧,但我仍然遇到它,我想我会添加这个为了完整性。

而不是使用:

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

你可以使用:

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

这似乎已经得到了我前进的反正。

来自this tutorial(链接部分3,因为它与前两个链接)。