XNA Вращая танк правильно

2

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

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

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

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

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

Надеюсь, вы, ребята, можете понять, что я пытаюсь сказать. Спасибо заранее:)

  • 0
    Вверх и вниз ты говоришь о вперед и назад?
  • 0
    Точно :) Вперед и назад
Показать ещё 1 комментарий
Теги:
xna

3 ответа

2
Лучший ответ

Я думаю, что вы ищете просто лучший способ свести к минимуму вращение резервуара по модулю на 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
}

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

4

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

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

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

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

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

  • 0
    Да, я получил все это :) То, что я хочу, это чтобы танк решал, в какую сторону вращаться танк, когда я хочу, чтобы он двигался.
0

Является ли ваша проблема движением направления в зависимости от угла поворота?

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

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

На сайте есть много учебников и примеров XNA http://creators.xna.com/en-US/education/catalog/

  • 0
    Нет, моя проблема в том, что я хочу, чтобы мой танк вращался как можно меньше, когда я говорю, чтобы он куда-то шел.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню