Медленные, крутые повороты вместо того, чтобы мгновенно смотреть на цель - PullRequest
2 голосов
/ 02 сентября 2011

У меня есть этот код, чтобы повернуться лицом к цели и двигаться к ней:

var x : Number = _targetPosition.value.x - _position.value.x;
var y : Number = _targetPosition.value.y - _position.value.y;

var targetAngle : Number = Math.atan2(y, x);

_angle.value = targetAngle; 
_velocity.value.setXY(Math.cos(targetAngle) * 90, Math.sin(targetAngle) * 90);

Как бы я вместо этого повернул, скажем, пару градусов (или четверть радиана или все, что вы хотите использовать, я могу преобразоватьв любом случае) кадр вместо?Возможно, цель движется, поэтому я не могу использовать формулу, которая учитывает время ... она должна просто поворачивать X градусов на кадр вместо мгновенного щелчка.

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

Спасибо!

1 Ответ

6 голосов
/ 02 сентября 2011

Если вы не заставляете свою программу запускаться с фиксированным временным шагом, любой алгоритм, который не учитывает ход времени, будет потенциально некорректным.В зависимости от аппаратного обеспечения частота кадров может сильно различаться;решение, которое работает на вашем компьютере со скоростью 80 FPS, не будет иметь такого же эффекта на Alienware от Joe Superuser за 5000 $, который запускает игру со скоростью 200 FPS.

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

Подумайте над следующим (не проверенным на макушке) кодом:

// Find the difference in angles, always going in the direction of least movement
var target = Math.atan2(x, y);
var difference = target - _angle.value;
if (difference > Math.PI)
{
    difference = ((2 * Math.PI) - difference);
}
if (difference < -Math.PI)
{
    difference = ((2 * Math.PI) + difference);
}
// Move the character's rotation a set amount per unit time
var delta = (difference < 0) ? -RotationChangePerSecond : RotationChangePerSecond;
_angle.value += delta * gameTime.ElapsedGameTime.TotalSeconds;

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

...