gpt4 book ai didi

c++ - 基于时间而非 FPS 的速度

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:55 25 4
gpt4 key购买 nike

我正在制作一个简单的应用程序,其中包含一个我对其施加重力的对象..

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

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

在游戏循环中我有这个:

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

这当然受游戏帧率的影响。

我希望物体每 16 毫秒移动 0.02 个单位,

所以我试着像这样修复它:

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

虽然 delta * 1000 给出了经过的毫秒数..

到目前为止一切顺利,它似乎工作正常并且对象以相同的速度移动,即使在较低的 FPS 下它跳跃更大的间隙,但这很好。

问题是我希望对象在某些情况下跳回。比如碰撞什么的,我曾经通过简单地做这样的事情来实现这一目标:velocity.y = -0.05;

但现在这行不通了,虽然它确实有效,但它再次依赖于 fps。它在更高的 FPS 率下跳得更高,在低 FPS 率下跳得更低。(我认为这可能是因为多次调用比预期的收集和降低速度更多,但事实并非如此,它只运行一次。)

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

谢谢

最佳答案

像这样根据时间计算你的速度和位置:

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 

关于c++ - 基于时间而非 FPS 的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16269641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com