所以我理解,要获得与帧速率无关的移动,我必须将基本速度乘以(1000 / delta)。它适用于表示速度的值,但是当我尝试使用加速变量时,例如重力,它不会工作,它甚至不是帧率独立的。
加速度变量有不同的公式,还是我忘了其他的东西?
示例:
var Multiplier:Number = (GetDeltaTime()) / (1000 / 30);
jumpVelocity = -21 * Multiplier //works
gravity = 1.5 * Multiplier //dosn't work
这是在每一帧的开头调用的
编辑:找到一个解决方案,我不得不平方delta时间。不是100%肯定它为什么会起作用,但确实如此。
所以:
jumpVelocity = -21 * Multiplier //unchanged
gravity = 1.5 * Math.pow(Multiplier,2) //works now
答案 0 :(得分:2)
基本上你想要做的是测量自上一帧(“帧时间”)以来经过的时间,并将其添加到累加器。
然后,您通过“固定时间步长”(例如1/30秒)转发游戏状态,并从累加器中减去该模拟时间,直到它少于一个时间步。
以此为例:
固定时间步长设置为33毫秒
1帧以20fps传递,帧时间为1000ms / 20 = 50ms
继续下一帧
1帧以10fps通过,帧时间为1000ms / 10 = 100ms
Glenn Fiedler有一篇关于这个问题的优秀文章。你可以找到它here。