![](/img/trans.png)
[英]How to create mipmaps based on maximum value rather than default merging?
[英]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.