所以,我有一个我正在制作的游戏,而且我遇到了障碍。我有两个精灵,称它们为A和B.到目前为止,我已经得到A非常简单地跟踪B:得到B的位置,如果它的X坐标大于A的X坐标,则将A的速度加到它的X位置。重复以及X位置小于A和Y位置。我还有一个指向它的位置,它存储它的旧的并使用一些简单的三角函数设置旋转。但是,现在我已经完成了其他所有工作,我想让这更加真实。当B从A的左侧快速移动到A的右侧时,A的角度和移动迅速从指向并从左下方移动到右下方。我需要它顺利移动。我在考虑延迟A可以改变它的角度的速度(比如,每次更新()调用可能是5度),但这不能解决问题,我最终会让A侧面移动一点。我意识到这是一个冗长的问题,我可能得不到很多答案,但是你们所说的任何事都会有很大的帮助。谢谢!
答案 0 :(得分:2)
我认为您正在构建predator-prey system。这些通常用微分方程建模,但简单的模拟算法是here。
答案 1 :(得分:0)
我建议随着时间的推移,而不是立即进行A的B跟踪(线性插值)。将Vector2存储在A
上,即它实际面对的位置,并将每个帧的位置向B
倾斜一定量,即硬编码角度或特定百分比。
这是一些将当前位置推向所需位置的示例代码。
Vector3 current = Vector3.Zero;
Vector3 desired = new Vector3(10, 0, -5);
// For this example we will lerp 75% of the way from 'current' to 'desired' per second
Vector3 LerpTowardDesired( Vector3 current, Vector3 desired, float timeDelta )
{
float lerpPercentage = timeDelta * 0.75f;
Vector3 newPos = Vector3.Zero;
newPos.x = MathHelper.Lerp(current.x, desired.x, lerpPercentage);
newPos.y = MathHelper.Lerp(current.y, desired.y, lerpPercentage);
newPos.z = MathHelper.Lerp(current.z, desired.z, lerpPercentage);
}
在上面的示例中,您只需每帧调用LerpTowardDesired
一次,以秒为单位传递经过的时间timeDelta
。注意timeDelta
是一个浮点数,因此传入的秒数包括部分秒数(例如0.016表示1/60秒,因此您不会舍入到最接近的秒数并传递0)。
使用我们上面定义的current
和desired
向量,这就是几帧过程中的结果,假设完美的60fps(每秒帧数)。
// After frame 1
current = LerpTowardDesired(current, desired, 0.016f);
// current is now (0.12f, 0.0f, -0.06f)
// After frame 2
current = LerpTowardDesired(current, desired, 0.016f);
// current is now (0.239f, 0.0f, -0.119f)
// After frame 3
current = LerpTowardDesired(current, desired, 0.016f);
// current is now (0.356f, 0.0f, -0.178f)
正如您可以看到超过3帧,current
位置已开始向desired
位置移动。如果你的精灵总是面向current
位置,他应该随着时间而不是立即跟踪目标精灵。
使用百分比来渲染,而不是每帧的硬编码度,最好的事情是目标移动得越快,冲击就越快,因为它将是更大距离的相同百分比。这意味着A
无论速度有多快,都会始终跟上B
。