我有一個以每秒60幀的速度運行的2D側滾動遊戲(用ActionScript 3製作)。我試圖讓它獨立於幀速率,因此它可以在較慢的設備上運行。在ActionScript 3中計算與幀無關的加速度
要做到這一點,我通過計算每幀之間已經經過了多少毫秒並將其除以16(我認爲60幀/秒約爲16ms)來創建一個名爲timeElapsed
的變量。因此,在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幀1和幀2之間的細微差別。 我想在60fps的任何兩幀之間獲得速度的平均值,並使用它來計算幀速率變化時更準確的值,但是我得到的感覺在其他情況下無法正常工作,例如60fps,它會使玩家移動115而不是110像素。
他們有什麼方法可以精確地模擬一個幀速率無關的加速對象嗎?
預先感謝您。
感謝您的答覆。這是我一開始就這樣做的,但我意識到,例如,每秒30幀,不僅需要彌補失去的加速度,而且還需要物體兩次行進距離爲30幀失去的距離。 雖然,我認爲你說得對,我現在所做的並不是正確的實施。 – Nytrus 2012-01-17 23:54:03
它將行駛兩倍的距離,因爲'速度'會翻倍。 – Cadin 2012-01-18 21:33:58