速度基于时间而不是FPS
Velocity based on time rather than FPS
我正在制作一个简单的应用程序,我对一个对象施加重力。
我不希望物体在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下,它会跳跃较大的间隙,但这很好。
问题是我希望对象在某些场合跳起来。比如碰撞之类的,我过去常常这样做:速度。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++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 从文本文件中读取时钟时间和事件时间并进行处理
- 具有未知值时的时间复杂性
- 如何减少花费的时间
- C++在变量给定的指定时间内关闭电脑
- rcpp函数中的清理时间很长
- C++:floor unix时间戳到UTC月份
- 16.66ms 帧时间.当 sleep() 只经过整毫秒时,你如何获得完美的 60 fps
- ffmpegc/c++获取帧计数或时间戳和fps
- 渲染时间只等于fps的一半
- 速度基于时间而不是FPS
- 在c++和matlab中测量FPS和执行时间