缓慢的,横扫式的转身,而不是立即面对目标

本文关键字:目标 面对 转身 缓慢 | 更新日期: 2023-09-27 18:07:22

我有这个代码转向面对一个目标,并向他们移动:

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度一帧,而不是立即捕获。

如果你能告诉我如何在考虑deltaTime的情况下应用旋转,那就太好了,但我可以试着弄清楚。

谢谢!

缓慢的,横扫式的转身,而不是立即面对目标

除非您强迫您的程序以固定的时间步长运行,否则任何不考虑时间流逝的算法都可能是不正确的。根据硬件的不同,帧率可能变化很大;在你的电脑上以80帧/秒运行的解决方案在Joe Superuser的5000美元Alienware上以200帧/秒运行的游戏不会有同样的效果。

你需要计算对象的当前角度和目标角度之间的差异,然后根据两者之间的差异将其角度增加一定数量,乘以从上一帧开始经过的时间。

考虑以下代码(未经测试):

// 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;

目标是否移动最终是无关紧要的。对于这段代码,您要问的问题是,"目标现在在哪里,我必须做些什么来面对它?"如果目标的位置在随后的帧中发生了变化,那么您需要移动的方向也将发生变化,并且对象将开始向相反的方向旋转,正如我假设您想要的那样。