速度基于时间而不是FPS

时间:2013-04-29 00:35:54

标签: c++ c math physics

我正在使用一个对象来制作一个简单的应用程序,我将重力应用于..

当fps速率发生变化时,我不希望对象变得太快/太慢,所以我四处寻找一种方法来做到这一点,我发现我需要增加运动的速度通过三角洲时间..

所以我决定去做,但我遇到了比预期更多的问题..

在游戏循环中我有这个:

gravityRate = 0.02;
velocity.y +=  gravityRate;
objectPosition.y -= velocity.y;

当然,这会受到游戏fps的影响。

我希望对象每16毫秒移动0.02个单位,

所以我试着解决它:

velocity.y += (gravityRate * (delta * 1000.0) ) / (1000 / 60);

虽然delta * 1000给了我传递的毫秒数。

到目前为止一切都那么好,看起来工作正常并且物体以相同的速度移动,即使在较低的FPS下它会跳出较大的间隙,但这很好。

问题在于我希望对象在某些情况下跳起来。如碰撞等, 我曾经通过简单地做这样的事情来实现这一点: velocity.y = -0.05;

但现在这不起作用,它确实有效,但它再次依赖于fps。 它在较高的FPS率下跳得更高,在低FPS率下更低。 (我认为这可能是因为多次调用聚集并降低速度超过预期,但事实并非如此,它仅运行一次。)

我一直试图解决它一段时间但我不断遇到更多问题..所以我真的很感激任何帮助

谢谢

1 个答案:

答案 0 :(得分:1)

根据时间计算您的速度和位置,如下所示:

deltaTime = currentTime - timeLastFrame    // time sins last frame
velocityDelta = deltaTime * gravityRate    // velocity change 

// calculate new position with only half of the velocity change this frame
objectPosition.y -= (velocity.y + (velocityDelta / 2)) * deltaTime   
velocity.y += velocityDelta 

需要根据您的游戏设置调整比例。


编辑:

所以在细节上 - 首先我们需要知道自上次以来发生了多少时间:

deltaTime = currentTime - timeLastFrame    // time sins last frame

随着速度随时间不断增加,我们需要计算自上一帧以来它增加了多少。自上一帧起的时间越长,速度变化越大,我们将它与增量时间相乘。

velocityDelta = deltaTime * gravityRate    // velocity change 

为了计算物体在帧期间移动了多少,计算该帧中的平均速度。这等于初始速度:velocity.y加上结束速度:velocity.y + velocityDelta除以2。简而言之,这可以写成(velocity.y + (velocityDelta / 2))。使用平均速度,我们可以通过乘以帧的增量时间来移动对象:

objectPosition.y -= (velocity.y + (velocityDelta / 2)) * deltaTime   

为了准备下一帧,我们还需要更新速度:

velocity.y += velocityDelta