2011-12-07 71 views
3

好的,這可能是非常基本的東西,我不明白actionscript,但我似乎無法得到任何與此。幀平滑代碼

我有一些代碼,是應該理順上ENTER_FRAME循環動畫:

private var m_lastTime:Number; 
private var clock_speed:Number = 5; 
    private function frameLoop(evt:Event):void 
    { 
     var currTime:int = getTimer(); 
     var deltaTime:Number = (currTime - this.m_lastTime) * 0.001; 
     this.m_lastTime = currTime; 
     //trace(deltaTime.toString() + "," + (deltaTime * clock_speed).toString()); 

     // why you no work? 
     var n:Number = clock_speed * deltaTime; 
     trace(n); 
     mcClockHand.rotation += .18;// Number(deltaTime * clock_speed); 

因此,大家可以看到,我計算幀之間的時間差,並且通過變速恆乘以。我想出了一個數值並將其跟蹤到輸出窗口。它在0.14和0.19之間波動,平均爲0.18。

如果我使用該值來抵消鍾控MC的旋轉,它將不會移動。 如果我使用如上所示的常數0.18,它將以每30秒大約1圈的速度向右移動。

所以他們都是數字類型,跟蹤顯示他們大致相同的價值。爲什麼一個能夠移動MC而另一個不能?

感謝您的任何建議!

+0

這聽起來像你得到一些int轉換錯誤。你可以嘗試更改'私人變量clock_speed:Number = 5;'到'私人變量clock_speed:Number = 5.0;'? –

回答

3

在您的第一個循環中,第一次計算deltaTime的結果爲NaN,因爲this.m_lastTime爲空。從那裏,你的代碼試圖增加一個不是數字的對象。一個簡單的解決辦法是在m_lastTime變量設置爲0,當你把它聲明:

private var m_lastTime:Number = 0; 

更好的解決辦法是檢查的情況下,當你的計算結果爲NaN。

var n:Number = clock_speed * deltaTime; 
if (isNaN(n)) n = 0; 
trace(n); 
mcClockHand.rotation += n;// Number(deltaTime * clock_speed); 
+0

啊,好的。所以你第一次通過循環說,m_lastTime是空的,這使deltaTime NaN,然後​​當我加入旋轉,IT變成NaN?因此,在下一次循環中,即使m_lastTime現在是一個實數,因此deltaTime現在是一個實數,因爲NaN + 5 == NaN,所以旋轉始終是NaN。是對的嗎? – LoveMeSomeCode

+0

非常。 NaN可能會很棘手,因爲它是一個數字的有效值,不會引發錯誤。但是,它在應用程序中仍可能導致意外的行爲。 – Corey

1

當你第一次使用它時,你沒有m_lastTime的初始值。如果在聲明它時初始化var,var m_lastTime:Number = getTimer();它可以工作。