2

我正在使用我在其上应用重力的对象制作一个简单的应用程序。

当 fps 速率发生变化时,我不希望对象走得太快/太慢,所以我四处寻找一种方法来做到这一点,我发现我需要将移动速度乘以 delta时间..

所以我决定去做,但我遇到的问题比我想象的要多。。

在游戏循环中,我有这个:

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 速率下跳得更低。(我认为这可能是因为多个调用聚集并降低速度超过预期,但事实并非如此,它只运行一次。)

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

谢谢

4

1 回答 1

2

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

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 
于 2013-04-29T01:05:40.550 回答