Flash 在ActionScript 3中计算与帧无关的加速度

Flash 在ActionScript 3中计算与帧无关的加速度,flash,actionscript-3,frame-rate,Flash,Actionscript 3,Frame Rate,我有一个2D侧面滚动游戏(用ActionScript3制作),每秒运行60帧。我正在尝试使它与帧速率无关,这样它就可以在较慢的设备上运行 为此,我创建了一个名为timeappeased的变量,通过计算每个帧之间经过的毫秒数,并将其除以16(我认为60 fps大约是16 ms),这样在60 fps时,结果大约是1。然后我用这个数字乘以任何与时间相关的变量(例如player.x=speed*timeappeased;),这是代码: private var oldTime :Numb

我有一个2D侧面滚动游戏(用ActionScript3制作),每秒运行60帧。我正在尝试使它与帧速率无关,这样它就可以在较慢的设备上运行

为此,我创建了一个名为
timeappeased
的变量,通过计算每个帧之间经过的毫秒数,并将其除以16(我认为60 fps大约是16 ms),这样在60 fps时,结果大约是1。然后我用这个数字乘以任何与时间相关的变量(例如
player.x=speed*timeappeased;
),这是代码:

private var oldTime          :Number;
private var defaultFrameRate :uint = 16; // the default frame rate in milliseconds
private var timeElapsed      :Number;

...

var newTime      :Number = getTimer();
var timePassed   :Number = newTime - this.oldTime;

this.timeElapsed = timePassed / this.defaultFrameRate;
this.oldTime     = newTime;
问题是,当我尝试将其应用于涉及每帧移动速度更快的对象的情况时,我遇到了这个问题:

这是导致问题的代码(对于本例,我对其进行了一些更改):

问题在于(不是真实值,只是一个示例):

如您所见,以每秒30帧的速度,播放器将以相同的实时量进一步移动。问题似乎在于,第一帧的速度为30fps,我当前的代码没有考虑到第一帧和第二帧在60fps时的速度差异。 我曾想过以60fps的速度获得任意两帧之间的速度平均值,并在帧速率变化时使用该值来计算更精确的值,但我感觉在其他一些情况下无法正常工作,因为例如,在60fps时,它将使播放器移动115像素,而不是110像素

他们有没有办法精确地模拟一个物体以与帧速率无关的方式加速


提前谢谢。

我认为您不应该将速度乘以经过的时间,因为您已经在计算加速度时考虑了经过的时间:

this.speed += (this.acceleration * this.timeElapsed);
this.x     += this.speed;

谢谢你的回复。起初我就是这样做的,但我意识到,以每秒30帧的速度,我不仅需要补偿损失的加速度,还需要物体移动两倍的距离,以补偿损失的30帧距离。尽管如此,我认为你说的可能是对的,我现在所做的也不是正确的实现。它将运行两倍的距离,因为
速度将加倍。
At 60 FPS:
frame 1: speed = 110; player.x = 110;
frame 2: speed = 120; player.x = 230;
frame 3: speed = 130; player.x = 360;
frame 4: speed = 140; player.x = 500;

At 30 FPS (At half the frame rate but the same ammount of real time):
frame 1: speed = 240; player.x = 240;
frame 2: speed = 280; player.x = 560;
this.speed += (this.acceleration * this.timeElapsed);
this.x     += this.speed;