控制時間間隔

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

當您使用 Adobe Flash CS4 Professional 開發應用程式時,可以存取時間軸,這會為應用程式提供穩定且以影格為單位的進度。但是,在完全使用 ActionScript 的專案中,就必須依賴其它時間機制。

迴圈與計時器的比較

在某些程式語言中,您必須使用迴圈陳述式 (如 for do..while ) 來自行設計計時機制。

迴圈陳述式的執行速度一般會視本機電腦而定,因此應用程式在某些電腦上的執行速度較快,某些則較慢。如果應用程式需要一致的時間間隔,您就必須將其與實際月曆或時鐘的時間繫結。許多應用程式,例如遊戲、動畫和即時控制器都需要規律、以時間驅動而且在每一部機器上都一致的計時機制。

ActionScript 3.0 的 Timer 類別即是強大的解決方案。使用 ActionScript 3.0 事件模型,每當達到指定的時間間隔,Timer 類別就會傳送計時器事件。

Timer 類別

在 ActionScript 3.0 中處理計時功能時,一般會使用 Timer 類別 (flash.utils.Timer),每當達到指定的時間間隔,這個類別就會傳送事件。

若要啟動計時器,您必須先建立 Timer 類別的實體,並指示產生計時器事件的頻率,以及要產生多少次事件才停止。

例如,下列程式碼會建立 Timer 實體,每秒傳送一次事件,持續 60 秒:

var oneMinuteTimer:Timer = new Timer(1000, 60);

每當達到指定的間隔時,Timer 物件就會傳送 TimerEvent 物件。TimerEvent 物件的事件類型為 timer (由常數 TimerEvent.TIMER 所定義)。TimerEvent 物件包含的屬性與標準 Event 物件相同。

如果將 Timer 實體設定為固定次數的間隔,那麼當達到最後的間隔時,也會傳送 timerComplete 事件 (由常數 TimerEvent.TIMER_COMPLETE 所定義)。

下面是一個小型樣本應用程式,顯示如何使用 Timer 類別:

package  
{ 
    import flash.display.Sprite; 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 
 
    public class ShortTimer extends Sprite 
    { 
        public function ShortTimer()  
        { 
            // creates a new five-second Timer 
            var minuteTimer:Timer = new Timer(1000, 5); 
             
            // designates listeners for the interval and completion events 
            minuteTimer.addEventListener(TimerEvent.TIMER, onTick); 
            minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); 
             
            // starts the timer ticking 
            minuteTimer.start(); 
        } 
 
        public function onTick(event:TimerEvent):void  
        { 
            // displays the tick count so far 
            // The target of this event is the Timer instance itself. 
            trace("tick " + event.target.currentCount); 
        } 
 
        public function onTimerComplete(event:TimerEvent):void 
        { 
            trace("Time's Up!"); 
        } 
    } 
}

建立 ShortTimer 類別時,會建立 Timer 實體,此實體會每秒計時一次,持續五秒。接著會將兩個偵聽程式加入計時器,一個用來偵聽每次計時,另一個則偵聽 timerComplete 事件。

接下來會啟動計時器,從現在開始, onTick() 方法就會每一秒執行一次。

onTick() 方法只會顯示目前的計時計數。等到五秒一過, onTimerComplete() 方法會執行,指出時間已到。

當您執行這個樣本時,會在主控台或追蹤視窗看到下面這幾行,每秒出現一行:

tick 1 
tick 2 
tick 3 
tick 4 
tick 5 
Time's Up!

flash.utils 套件中的計時函數

ActionScript 3.0 包含幾個計時函數,這些計時函數和 ActionScript 2.0 所提供的類似。這些函數在 flash.utils 套件中是以套件層級的函數提供,其運作方式和在 ActionScript 2.0 中完全相同。

函數

說明

clearInterval(id:uint):void

取消指定的 setInterval() 呼叫。

clearTimeout(id:uint):void

取消指定的 setTimeout() 呼叫。

getTimer():int

傳回從初始化 Adobe® Flash® Player 或 Adobe® AIR™ 以後所經過的毫秒數。

setInterval(closure:Function, delay:Number, ... arguments):uint

在指定的間隔 (以毫秒為單位) 執行函數。

setTimeout(closure:Function, delay:Number, ... arguments):uint

在指定的延遲時間 (以毫秒為單位) 後執行指定的函數。

ActionScript 3.0 保留這些函數以提供舊版相容性。Adobe 不建議您在新的 ActionScript 3.0 應用程式中使用這些函數。一般來說,在應用程式中使用 Timer 類別會較容易且具備效率。