Actionscript 3 帧率无关加速度

Actionscript 3 帧率无关加速度,actionscript-3,physics,formula,Actionscript 3,Physics,Formula,所以我知道,要获得与帧速率无关的运动,我必须将基本速度乘以(1000/delta)。它适用于表示速度的值,但当我尝试使用加速度变量(例如重力)时,它不起作用,甚至与帧速率无关 加速度变量有不同的公式吗,还是我忘了别的 例如: var Multiplier:Number = (GetDeltaTime()) / (1000 / 30); jumpVelocity = -21 * Multiplier //works gravity = 1.5 * Multiplier //dosn't work

所以我知道,要获得与帧速率无关的运动,我必须将基本速度乘以(1000/delta)。它适用于表示速度的值,但当我尝试使用加速度变量(例如重力)时,它不起作用,甚至与帧速率无关

加速度变量有不同的公式吗,还是我忘了别的

例如:

var Multiplier:Number = (GetDeltaTime()) / (1000 / 30);
jumpVelocity = -21 * Multiplier //works
gravity = 1.5 * Multiplier //dosn't work
这将在每帧的开始处调用

编辑:找到了一个解决方案,我不得不平方时间差。不是100%确定它为什么有效,但它确实有效

因此:


基本上,您要做的是测量自上一帧以来经过的时间(“帧时间”),并将其添加到累加器中

然后通过“固定时间步”(例如1/30秒)向前移动游戏状态,并从累加器中减去模拟时间,直到小于一个时间步

例如:

  • 累加器从0开始
  • 固定时间步长设置为33毫秒

  • 1帧以20fps通过,帧时间为1000ms/20=50ms

  • 向蓄电池添加50毫秒
  • 游戏状态由一个固定的时间步长(33ms)转发,该时间从累加器中减去
  • 累加器现在是17ms,这比一个固定的时间步长要短->游戏状态更新完成
  • 继续下一帧

  • 1帧以10fps通过,帧时间为1000ms/10=100ms

  • 向蓄能器添加100毫秒
  • 累加器现在为117ms
  • 游戏状态由一个固定的时间步长(33ms)转发,该时间从累加器中减去
  • 累加器现在是84ms,这是一个以上的固定时间步长->游戏状态未完成更新
  • 游戏状态由一个固定的时间步长(33ms)转发,该时间从累加器中减去
  • 累加器现在是51毫秒,这是一个以上的固定时间步长->游戏状态未完成更新
  • 游戏状态由一个固定的时间步长(33ms)转发,该时间从累加器中减去
  • 累加器现在是18ms,这比一个固定的时间步长要短->游戏状态更新完成
  • 继续下一帧

格伦·费德勒(Glenn Fiedler)有一篇关于这个问题的优秀文章。你可以找到它。

我对actionscript一无所知,但我懂物理,这对我来说毫无意义。你知道单位吗?你能给我们一些数字,告诉我们出了什么问题(不仅仅是“它不行”)?单位是像素/30秒。基本上,除了加速度、重力和摩擦力外,一切都能工作。所有这些都会改变速度,而不是坐标。在较高的帧速率下,这些值似乎会增加(例如更快的加速度、更高的重力)。感谢您的帮助,但我以前确实读过这篇文章。我决定不使用它,因为正如文章最后一节所述,每个帧可能会采取不同数量的步骤,使其变得不稳定。这篇文章提供了一个解决方案,但我使用的是flash,速度太慢了。@simon无法澄清:固定时间步长物理的整个想法是,它看起来不起伏不定。事实上,如果你更进一步,对状态进行插值(这在文章末尾提到),你将得到最平滑、最好看的结果,无论在任何游戏、任何模拟、任何地方。也许会有帮助。看看这两个主权财富基金的例子,分别是“基于框架的案例研究”和“基于计时器的案例研究”,然后告诉我哪一个在你看来很复杂:)
jumpVelocity = -21 * Multiplier //unchanged
gravity = 1.5 * Math.pow(Multiplier,2) //works now