我有一个2D侧滚动游戏(使用ActionScript 3制作),每秒运行60帧。我试图使帧率独立,因此它将在较慢的设备上运行。
为了做到这一点,我通过计算每帧之间经过了多少毫秒并将其除以16来创建一个名为timeElapsed
的var(我认为60 fps大约是16 ms)。所以60 pps的结果将是大概1.然后我通过这个数字任何时间相关的变量(例如player.x = speed * timeElapsed;
)这是代码:
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;
问题是,当我尝试在涉及每帧移动速度更快的对象的情况下应用此问题时,我遇到了这个问题:
这是导致问题的代码(我在本例中稍微改了一下):
private var speed :Number = 100;
private var acceleration :Number = 10;
...
this.speed += (this.acceleration * this.timeElapsed);
this.x += this.speed * this.timeElapsed;
问题就是这个(不是真正的价值,只是一个例子):
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;
正如您所看到的,每秒30帧,玩家将以相同的实时时间进一步移动。似乎问题在于,在第一帧中的30fps,我当前的代码没有考虑第一帧和第二帧之间60fps的速度的微小差异。 我想到在60fps的任意两帧之间获得速度的平均值,并且当帧速率改变时使用它来计算更准确的值但是我感觉在其他情况下不能正常工作,因为例如60fps,它将玩家移动115而不是110像素。
他们以任何方式准确地模拟以与帧速率无关的方式加速的对象吗?
提前谢谢。
答案 0 :(得分:1)
我认为您不应该将速度乘以经过的时间,因为您已经计算了加速计算中的经过时间:
this.speed += (this.acceleration * this.timeElapsed);
this.x += this.speed;