繁体   English   中英

基于时间而不是FPS的速度

[英]Velocity based on time rather than FPS

我正在使用我对其施加重力的对象进行简单的应用。

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

我已经尝试解决了一段时间,但是随着我的前进,我不断遇到更多的问题..因此,我非常感谢任何帮助

谢谢

像这样计算基于时间的速度和位置:

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM