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

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

2 голосов
/ 25 августа 2009

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

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 25 августа 2009

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

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

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

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

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

2 голосов
/ 25 августа 2009

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

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

0 голосов
/ 25 августа 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 (радианы) должны решить эту проблему.

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

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