缓慢,缓慢的转弯,而不是立即面对目标 - c#

我有以下代码可以面对目标并朝着目标迈进:

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 FPS运行的解决方案对以200 FPS运行游戏的Joe Superuser的$ 5000 Alienware不会产生相同的影响。

您需要计算对象的当前角度和目标角度之间的差,然后根据这两个角度之间的差乘以自上一帧以来经过的时间,将其角度增加一定量。

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

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

目标是否在移动最终是无关紧要的。您用此代码询问的问题是:“目标现在在哪里,面对它我该怎么办?”如果目标的位置在随后的帧中发生变化,那么您需要移动的方向也会发生变化,并且对象将按照我想的那样开始朝相反的方向旋转。

Math.log无法正常工作-为什么? - java

//以下方法无法正常工作,我不确定为什么。日志结果不正确。 0.5返回日志值-0.6931471805599453,但是我的计算器显示它应该返回-3.3。public static void printCommonLogTable() { double x = 0; while (x <= 10) { System.out.println (x+ &#…

Math.max和Math.min输出允许的最高和最低值 - java

所以我正在尝试制作一个程序,该程序将输出总和,平均值以及最小和最大值。除了最小和最大值输出2147483647和-2147483647,我基本上已经弄清楚了所有东西,我相信这是Java将计算的绝对最小和最大值。无论如何,我想计算用户输入的数字,因此这显然是不正确的。这是我的课。我认为addValue方法出了问题。public class DataSet { …

用lambda重新定义函数或调用标准API(Math.Ceiling) - c#

我想计算严格为正整数的上限除法。我可以在以下两种实现方式之间进行选择:var ceil = new Func<int, int, int>((a, b) => a % b > 0 ? a / b + 1 : a / b); var x = ceil(y, z); // y and z being int previously defi…

XNA Keyboard.GetState()不返回所有按下的键 - c#

我正在学习XNA(v。4.0),并且正在使用键盘上的箭头键移动精灵,并在保持空格的同时使字符冲刺。以下是我的代码来确定按下了哪些键:currentKBState = Keyboard.GetState(); bool right = currentKBState.IsKeyDown(Keys.Right); bool left = currentKBStat…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制