2012-01-17 29 views
0

我有一個以每秒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幀的播放器被進一步移動相同的實時量。看起來這個問題是,在第一幀的30f​​ps下,我目前的代碼沒有考慮60fps幀1和幀2之間的細微差別。 我想在60fps的任何兩幀之間獲得速度的平均值,並使用它來計算幀速率變化時更準確的值,但是我得到的感覺在其他情況下無法正常工作,例如60fps,它會使玩家移動115而不是110像素。

他們有什麼方法可以精確地模擬一個幀速率無關的加速對象嗎?

預先感謝您。

回答

1

我不認爲你應該速度經過時間來相乘,因爲你已經佔了在計算所經過的時間加速:

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

感謝您的答覆。這是我一開始就這樣做的,但我意識到,例如,每秒30幀,不僅需要彌補失去的加速度,而且還需要物體兩次行進距離爲30幀失去的距離。 雖然,我認爲你說得對,我現在所做的並不是正確的實施。 – Nytrus 2012-01-17 23:54:03

+0

它將行駛兩倍的距離,因爲'速度'會翻倍。 – Cadin 2012-01-18 21:33:58