XNA Vector2轮换问题

时间:2010-04-20 20:20:27

标签: xna rotation

我正在搞乱XNA中的一些东西,并试图在小行星风格周围移动一个物体,因为你按左右旋转和上/下按照你指向的方向向前和向后移动。 / p>

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

我猜这是直截了当但我无法理解。我的“船”类具有以下值得注意的属性:

Vector2 Position
float Rotation

“ship”类有一个更新方法,处理输入,到目前为止,我有以下内容:

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

任何帮助都将非常感谢!

3 个答案:

答案 0 :(得分:5)

好的,所以这就是我做的方式(我知道会有一个非触发解决方案!)

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

答案 1 :(得分: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部分,因为它链接到前两个)。

答案 2 :(得分: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;
        }
    }