XNA Правильное вращение резервуара

Я делаю 2D-игру, в которой игрок управляет танком.

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

Я хочу, чтобы она вела себя так же, как игра Tanks для Wii. Фиксированные направления, без реального переда и зада танка.

Движение вверх, а затем влево должно заставить его вращаться влево. Движение вверх, а затем вниз не должно заставлять его вращаться, просто двигайтесь в другом направлении.

Некоторое время назад я написал учебник о том, как это сделать, разделив градусы на 2 части по 180 градусов. Но я просто не смог снова найти этот чертов сайт.

Я надеюсь, что вы, ребята, в состоянии понять, что я пытаюсь сказать. Заранее спасибо :)


person Moulde    schedule 25.08.2009    source источник
comment
Под вверх и вниз вы имеете в виду вперед и назад?   -  person Lazarus    schedule 25.08.2009
comment
Точно :) Вперед и назад   -  person Moulde    schedule 25.08.2009
comment
Я все еще ищу сайт с этим примером вращения с использованием какого-то метода, который принимает угол в качестве параметра, а затем возвращает его, разделенный на два угла или что-то в этом роде.   -  person Moulde    schedule 25.08.2009


Ответы (3)


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

Я бы использовал угол между желаемым направлением движения и текущим направлением танка для начала. Убедитесь, что это минимальный угол, затем сравните его с углом между текущим направлением танка и 180 градусами. Что-то типа:

// smallest angle between the current direction and the desired direction
minAngle1 = Math.Abs(Math.Min(tankAngle - desiredAngle, desiredAngle - tankAngle));

// smallest angle between the opposite direction and the desired direction
oppositeAngle = (tankAngle + 180) % 360;
minAngle2 = Math.Abs(Math.Min(oppositeAngle - desiredAngle, desiredAngle - oppositeAngle));

// get the smaller of two to rotate to
if (minAngle1 < minAngle2)  {
  // we know that we should rotate the current direction to the desired direction
} else {
  // rotate the opposing direction to the desired direction
}

Обратите внимание, что вам нужно будет поиграть со знаками вращения, чтобы убедиться, что вы вращаетесь в правильном направлении. Кроме того, я предположил, что вы знаете свои углы поворота, если у вас есть векторы, вы можете немного упростить это, используя скалярное произведение между двумя векторами вместо угла для сравнения.

person Ron Warholic    schedule 25.08.2009

Я полагаю, вы рисуете свой танк как спрайт? В этом случае существует перегрузка метода SpriteBatch.Draw, позволяющая указать угол поворота вокруг исходной точки.

Перегрузка SpriteBatch.Draw

Вот пример того, как использовать его из MSDN

В приведенном выше примере ваш спрайт будет вращаться, поэтому вам нужно будет добавить некоторую пользовательскую логику, чтобы он вращал его только в соответствии с вводом с клавиатуры. Вот простой пример проверки ввода с клавиатуры. Поэтому добавьте логику, которая проверяет, была ли нажата правая или левая кнопка, и обновляет угол поворота, если это так. Если была нажата кнопка вверх или вниз, вы просто изменяете положение своего спрайта.

Я надеюсь, что это имеет смысл, в противном случае просто дайте мне знать.

person Tchami    schedule 25.08.2009
comment
Да, я все понял :) Я хочу, чтобы танк сам решал, в какую сторону ему вращаться, когда я хочу, чтобы он двигался. - person Moulde; 25.08.2009

Ваша проблема с направлением движения основана на угле, на который они повернуты?

Vector2 moveDir = new Vector2(Math.Cos(rotation), Math.Sin(rotation));
position += (moveDir * speed);

Скорость здесь будет числом, указывающим, насколько быстро вы хотите двигаться в этом направлении. position — это еще один Vector2 для положения спрайта. Как говорит Чами, вы можете нарисовать его с вращением, используя перегрузку SpriteBatch.Draw. Поворот для методов Cos и Sin должен быть в радианах, но я думаю, что Draw должен быть в градусах, если я правильно помню. MathHelper.ToRadians(степени) и MathHelper.ToDegrees(радианы) должны решить эту проблему.

На сайте http://creators.xna.com/en-US/education/catalog/

person A Jackson    schedule 25.08.2009
comment
Нет, моя проблема в том, что я хочу, чтобы мой танк вращался как можно меньше, когда я говорю ему идти куда-то. - person Moulde; 25.08.2009