Если вы не заставляете свою программу запускаться с фиксированным временным шагом, любой алгоритм, который не учитывает ход времени, будет потенциально некорректным.В зависимости от аппаратного обеспечения частота кадров может сильно различаться;решение, которое работает на вашем компьютере со скоростью 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;
Вне зависимости от того, движется цель или нет, это не имеет значения.Вопрос, который вы задаете с помощью этого кода: «Где сейчас цель и что мне нужно сделать, чтобы с ней столкнуться?»Если позиция цели изменится в последующем кадре, то направление, в котором вы должны двигаться, также изменится, и объект начнет вращаться в противоположном направлении, как я полагаю, вы намерены.