2012-09-07 247 views
2

這段代碼是否會延遲每次循環被觸發之間的時間?如何延遲while循環?

while (coin.x > objYEnemy.x) { 

    var delay:Timer = new Timer(100, 1); 
    delay.addEventListener(TimerEvent.TIMER, runOnce); 
    delay.start(); 
    function runOnce(event:TimerEvent):void { 
      coin.x -= 1; 
    delay.stop(); 
    } 
} 
+0

我知道這已經得到了回答,但谷歌「閃存僞線程」,我想你會發現一些有趣的事情。如果你有一個應用程序有多個嵌套循環和在這些循環內創建的對象,你會看到一個滯後(我猜你爲什麼問這個問題)。僞線程背後的想法是模仿能夠通過創建一個定時器來運行一個函數,直到某個條件成立爲止,將這些循環引入到一個單獨的處理線程中。你基本上模仿多線程,創建你自己的循環類。 –

+0

別擔心,只有2個循環,並且在這些循環中沒有創建對象,但這是建議。我絕對檢查出來:) – Zoske

回答

4

不是。你的循環會一直保持運行(至少100毫秒,而你的計時器等待着火),每次創建一個新的計時器,並創建一個內存泄漏,因爲你的計時器永遠不會因爲它們的事件監聽器而被處置掉。由於runOnce是一個匿名函數,因此每創建一個計時器也會運行很多次。

如果你不知道你想要完成什麼,那麼你會想要做的就是讓計時器滴答處理程序成爲循環函數。

var checkTimer:Timer = new Timer(100); 
checkTimer.addEventListener(TimerEvent.TIMER, doCheck); 
checkTimer.start(); 

function doCheck(e:Event):void { 
    if(coin.x > objYEnemy.x){ 
     coin.x -= 1; 
     //If you want this to only happen once, then add the following line: 
     checkTimer.stop();  
    } 
} 
+0

謝謝!這兩個awnsers很好地解釋了我,但是這個代碼稍微好一些。 :) – Zoske

0

號的第一個問題是,當循環運行首次runOnce是不確定的,所以它甚至不會運行一次。第二個問題是執行代碼的順序:循環將啓動大量的定時器,直到滿足中斷條件爲止,一旦定時器觸發執行runOnce,就會發生這種情況。使用LondonDrugs_MediaServ的代碼,並在您不再需要計時器後取消註冊事件監聽器,以便可以收集垃圾。