我正在开发一款游戏,我需要创建一种方法来创建运动。它需要做的是取x y
和target x y
值并创建 float[]
其内部的运动被定义为一定的时间。该运动将在每一帧中使用一定数量的帧,直到在特定时间内达到目标。这是我到目前为止所拥有的。
public void calculateRoute(int time) {
if(x > tx){
movement[0] = -((x - tx) / time);
}else if(x < tx){
movement[0] = ((tx - x) / time);
}else if(x == tx){
movement[0] = 0;
}
if(y > ty){
movement[1] = -((y - ty) / time);
}else if(y < ty){
movement[1] = ((ty - y) / time);
}else if(y == ty){
movement[1] = 0;
}
}
问题是目标越远,移动速度越快。我想让运动调节到一定的速度但仍能达到目标。基本上我需要计算 time
可变为无论距离多远,速度始终相同的速度。我尝试将运动设置为 1,但它会错过其目标,因为 x
可能是 500,而 y
可能是 700。最终会是 x = 700, y = 700
。任何帮助表示赞赏! :)
还有一些示例代码就更好了!
最佳答案
需要考虑的一些事情:
- 在当今的多核、多任务计算机中,您无法可靠地预测每个渲染帧或每个逻辑/物理/AI 更新之间会经过多少时间。
- 正如您在解决方案中发现的那样,您的速度计算是基于距离的,而它需要每单位时间移动的单位(可能是像素/秒,或 block /秒 -任何在您的游戏中有意义的度量单位)。
- 当您在世界中移动物体时,通常最好测量自上次移动物体以来耗时,然后将耗时乘以您的速度,因为
速度*时间=距离搬家了
如果您使用游戏引擎,这将是一个非常好的主意,因为这是一个已解决的问题,它们将提供某种“增量”时间,告诉您自上次逻辑/物理以来已经过去了多少时间/人工智能更新。您可以使用该值。
- Here's an explanation of how deltaTime works in Unity ,当今流行的游戏引擎
- Here's some sample code I wrote in Java that uses Slick2D ,但这个概念在任何游戏/游戏引擎中都是相同的。
关于java - 调节游戏中的步速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24335464/