2012-06-12 68 views
1

我通常使用XNA開發遊戲,使用XNA時常見的事情之一是確保您基於ElapsedGameTime更新每個實體。即使幀速率可變,也可以平滑移動。Actionscript 3相當於XNA ElapsedGameTime

我正在使用FlashDevelop在AS3中尋找該功能。

到目前爲止,我想出了:

public function Update():void 
{ 
    var currentTime:Number = getTimer(); 
    var elapsedTime:Number = currentTime - lastFrame; 
    elapsedTime /= 1000; 

    //use elapsedTime here for movement 
    player.x += speed.x * elapsedTime 

    lastFrame = getTimer(); 
} 

對於使用這個,我真的不能告訴如果它實際上是工作或沒有。當我執行此操作時,我並沒有真正看到區別。

這種是否類似?有沒有另一種方法來做到這一點?

回答

2

看起來你可能會發現在使用這個和使用enter_frame處理程序時沒有什麼區別,如果是這樣的話,那麼給定幀所需的所有處理都可能在分配的時間內發生,而且它實際上能夠在1/24秒平滑地更新(默認frameRate是24)。測試差異的一種方法是修改frameRate屬性,並查看「字符」的速度是否受frameRate中的更改影響。您也可以使用trace(elapsedTime)之類的跟蹤語句,您還可以添加一個enter_frame事件處理程序,並跟蹤這些幀並追蹤該幀,以便更好地瞭解它如何執行以及它是如何產生差異的。這似乎是一種完全有效的方式,雖然我沒有做過很多Flash遊戲編程,但在Flash RIA開發方面有很多經驗,我沒有發現這種方法有什麼問題。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/Application.html#frameRate

如果使用純AS3,你會設置此使用元數據對你喜歡的主類:

http://flassari.is/2009/02/swf-metadata-in-pure-as3-projects/

http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf680e1-7ffe.html#WS4b4ddee4904fe7796d38fa291219d46bcb4-8000

0

您可以嘗試使用Timer類,而不是ENTER_FRAME

var myTimer:Timer = new Timer(1000, 1); // (ms, repeats = set to 0 for infinity) 
myTimer.addEventListener(TimerEvent.TIMER, runOnce); 
myTimer.start(); 

function runOnce(event:TimerEvent):void { 
    trace("runOnce() called @ " + getTimer() + " ms"); 
} 


var myTimer:Timer = new Timer(1000); // (ms) 
myTimer.addEventListener(TimerEvent.TIMER, runMany); 
myTimer.start(); 

function runMany(event:TimerEvent):void { 
    trace("runMany() called @ " + getTimer() + " ms"); 
}