Sterowanie przedziałami czasu

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Autor aplikacji w programie Adobe Flash CS4 Professional ma dostęp do osi czasu, która reprezentuje jednostajny upływ czasu w aplikacji, wyznaczony kolejnymi klatkami. Jednak w projektach zawierających wyłącznie kod ActionScript konieczne jest zastosowanie innych mechanizmów odmierzania czasu.

Pętle a liczniki czasu

W niektórych językach programowania konieczne jest samodzielne odmierzanie czasu przy użyciu instrukcji pętli, takich jak for lub do..while.

Szybkość wykonywania instrukcji pętli zależy od szybkości komputera lokalnego, co oznacza, że aplikacja na jednych komputerach działa szybciej, a na innych wolniej. Jeśli aplikacja wymaga niezawodnego odmierzania czasu, konieczne jest powiązanie jej z rzeczywistym kalendarzem lub czasem zegarowym. W wielu aplikacjach, takich jak gry, animacje i sterowniki działające w czasie rzeczywistym, niezbędne są mechanizmy odmierzające regularne odstępy czasu, niezależne od szybkości konkretnego komputera.

Klasa Timer w języku ActionScript 3.0 oferuje takie zaawansowane rozwiązanie. Bazując na modelu zdarzeń języka ActionScript 3.0, klasa Timer wywołuje zdarzenia po upływie zadanego czasu.

Klasa Timer

Preferowanym sposobem odmierzania czasu w języku ActionScript 3.0 jest użycie klasy Timer (flash.utils.Timer), która umożliwia wywoływanie zdarzeń po upływie określonego czasu.

Aby uruchomić licznik czasu, należy utworzyć instancję klasy Timer, określając częstotliwość wywoływania zdarzeń oraz liczbę zdarzeń, jaka ma być wygenerowana przed zatrzymaniem licznika.

Poniższy przykładowy kod tworzy instancję klasy Timer, która wywołuje zdarzenie co sekundę, przez 60 sekund:

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

Obiekt Timer wywołuje obiekt zdarzenia TimerEvent za każdym razem po upływie zadanego przedziału czasu. Typem zdarzenia skojarzonym z obiektem TimerEvent jest timer (typ zdefiniowany przez stałą TimerEvent.TIMER ). Obiekt TimerEvent zawiera te same właściwości, co standardowy obiekt Event.

Jeśli dla instancji klasy Timer zostanie określona stała liczba okresów, to po odliczeniu ostatniego okresu wywołane zostanie zdarzenie timerComplete (zdefiniowane przez stałą TimerEvent.TIMER_COMPLETE ).

Oto niewielka przykładowa aplikacja ilustrująca działanie klasy 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!"); 
        } 
    } 
}

Podczas tworzenia klasy ShortTimer tworzona jest instancja klasy Timer, która generuje zdarzenia raz na sekundę przez pięć sekund. Następnie do licznika czasu dodawane są dwa detektory: jeden z nich wykrywa każdy odmierzony okres, a drugi wykrywa zdarzenie timerComplete .

Teraz rozpoczyna się odmierzanie czasu i od tego momentu metoda onTick() jest wykonywana co sekundę.

Metoda onTick() po prostu wyświetla numer aktualnego okresu. Po upływie pięciu sekund wykonywana jest metoda onTimerComplete() informująca o upływie limitu czasu.

Po uruchomieniu tego przykładowego programu na konsoli lub w oknie śledzenia powinny pojawić się następujące wiersze, generowane z szybkością jednego wiersza na sekundę:

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

Funkcje odmierzające czas zawarte w pakiecie flash.utils

Język ActionScript 3.0 oferuje szereg funkcji do odmierzania czasu, podobnych do funkcji dostępnych w języku ActionScript 2.0. Są to funkcje zdefiniowane na poziomie pakietu, w pakiecie flash.utils. Działają tak samo, jak w wersji ActionScript 2.0.

Funkcja

Opis

clearInterval(id:uint):void

Anuluje określone wywołanie setInterval() .

clearTimeout(id:uint):void

Anuluje określone wywołanie setTimeout() .

getTimer():int

Zwraca liczbę milisekund, jaka upłynęła od zainicjowania programu Adobe® Flash® Player lub środowiska Adobe® AIR™.

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

Uruchamia funkcję regularnie po upływie określonego przedziału czasowego (w milisekundach).

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

Uruchamia funkcję po określonym czasie (w milisekundach).

Funkcje te zachowano w języku ActionScript 3.0 ze względu na zgodność wstecz. Firma Adobe nie zaleca używania ich w nowych aplikacjach pisanych w języku ActionScript 3.0. Z reguły użycie klasy Timer będzie łatwiejsze i zapewni większą wydajność.