【发布时间】:2012-02-12 00:50:40
【问题描述】:
我有一个以每秒 60 帧的速度运行的 2D 横向滚动游戏(使用 ActionScript 3 制作)。我正在尝试使其独立于帧速率,以便它可以在较慢的设备上运行。
为此,我创建了一个名为 timeElapsed 的变量,方法是计算每帧之间经过的毫秒数并将其除以 16(我认为 60 fps 约为 16 毫秒。)因此,在 60 fps 时,结果约为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 像素。
他们有什么方法可以准确地模拟以独立于帧速率的方式加速的对象吗?
提前谢谢你。
【问题讨论】:
标签: flash actionscript-3 frame-rate