Вопрос поворота XNA Vector2 - PullRequest
2 голосов
/ 21 апреля 2010

Я возиться с некоторыми вещами в XNA и пытаюсь переместить объект вокруг стиля астероидов, нажимая его влево и вправо для поворота и вверх / вниз, чтобы двигаться вперед и назад в направлении, которое вы указываете. 1001 *

Я выполнил вращение спрайта, но не могу заставить объект двигаться в направлении, на которое вы указали, он всегда перемещается вверх и вниз по оси x = 0.

Я предполагаю, что это прямо, но я просто не могу понять это. Мой класс «Корабль» обладает следующими свойствами, достойными внимания:

Vector2 Position
float Rotation

У класса "ship" есть метод update, где ввод обрабатывается, и до сих пор у меня было следующее:

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 ]

5 голосов
/ 21 апреля 2010

ОК, вот как я это сделал (я знал, что будет решение без триггера!)

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;
}
2 голосов
/ 04 ноября 2012

Я понимаю, что это немного старый, но я все еще сталкивался с этим, и я решил добавить это для полноты картины.

Вместо использования:

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

Похоже, это все равно заставило меня двигаться вперед.

Получено из этого урока (Ссылка на часть 3, так как содержит ссылки на первые два).

1 голос
/ 21 апреля 2010

Я считаю, что общая формула

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