Keywords

Animation mit einem Timer

In den vorhergehenden Kapiteln ist die Geschwindigkeit der Animation von der Bildrate der swf-Datei abhängig. Um von der Bildrate (fast) unabhängig zu sein, kann man einen Timer definieren, der regelmäßig in einem frei wählbaren Intervall ein Timer-Ereignisse auslöst.
Diese Timer-Ereignisse kann der Timer nun mit einem Eventlistener (Eventhandler) abonnieren, der damit eine Eigenschaft regelmäßig verändert (animiert).

Grundsätzlicher Aufbau eines Skripts für eine TIMER-Animation

1. Initialisierungblock, in dem Variable initialisiert 
und eventuell für Movieclips die Startwerte für bestimmte Eigenschaften gesetzt werden
 
2. Timerobjekt erzeugen, :
var timer:Timer = new Timer(Zeitintervall);

3. Zuordnung des Eventlisteners (das Timerobjekt "abonniert" das Timerevent):
timer.addEventListener(TimerEvent.TIMER, timerListener);

4. Starten des Timers:
timer.start();
 
5. Defintion des Eventlisteners, der ein Screenupdate sowie
das Entfernen des Eventlisteners und Stoppen des Timers enthält:
function timerListener(e:TimerEvent):void {
relative Veränderung von MovieClip-Eigenschaften (das ist der zentrale Punkt für die Animation)
e.updateAfterEvent();
if (Abbruchkriterium für die Animation ist erfüllt) {
abschließende Aktionen
timer.removeEventListener(TimerEvent.TIMER, timerListener);
timer.stop();
}
}

 
Beispiel: Bewegen eines Kreises vom linken zum rechten Bühnenrand

Das nachfolgende Skript ist wieder im ersten Frame der Timeline platziert.
Beim Movieclip Kreis in der Bibliothek muss Export für ActionScript aktiviert sein.

Schritt 1: Initialisierungsblock

Erzeugen und platzieren einer Kreisinstanz am linken Bühnenrand und Schrittweite festlegen:

var kreis_mc:MovieClip = new Kreis();
this.addChild(kreis_mc);
kreis_mc.x = kreis_mc.width/2;
kreis_mc.y = stage.stageHeight/2;
var speed:Number = 10;

Schritt 2: Eine Timer-Instanz aus der Timer-Klasse erzeugen

var timer:Timer = new Timer(20,0)
 
new Timer (20,0)
erzeugt ein Timerobjekt, das alle 20 Millisekunden ein Timerereignis auslöst.
Der zweite Parameter gibt die Anzahl der Wiederholungen an. Wenn der Wert 0 ist, wird der Timer unbegrenzt ausgeführt.

Schritt 3: Zuordnung des Eventlisteners

timer.addEventListener(TimerEvent.TIMER, bewegeKreis);
Schritt 4: Timer starten
timer.start();
Schritt 5: Eventhandler definieren
function bewegeKreis(e:TimerEvent):void {
kreis_mc.x += speed;
e.updateAfterEvent();
if (kreis_mc.x + kreis_mc.width/2 > stage.stageWidth) {
kreis_mc.x = stage.stageWidth - kreis_mc.width/2;
timer.removeEventListener(Event.ENTER_FRAME, bewegeKreis);
timer.stop();
}
}
Durch e.updateAfterEvent(); wird unabhängig von der Bildrate ein Neuzeichnen der Bühne erzwungen. Dieser Befehl ist wichtig, denn sonst würde die Bühne wieder nur entsprechend der Bildrate aktualisiert werden. Aber genau das möchte man durch die Verwendung eines Timers umgehen.

Das Skript zusammengefasst:
var kreis_mc:MovieClip = new Kreis();
this.addChild(kreis_mc);
kreis_mc.x = kreis_mc.width/2;
kreis_mc.y = stage.stageHeight/2;
var speed:Number = 10;
 
var timer:Timer = new Timer(20,0);
timer.addEventListener(TimerEvent.TIMER, bewegeKreis);
timer.start();
 
function bewegeKreis(e:TimerEvent):void {
kreis_mc.x += speed;
e.updateAfterEvent();
if (kreis_mc.x + kreis_mc.width/2 > stage.stageWidth) {
kreis_mc.x = stage.stageWidth - kreis_mc.width/2;
timer.removeEventListener(Event.ENTER_FRAME, bewegeKreis);
timer.stop();
}
}
Wichtige Anmerkungen:
 
Ein Timer ist NICHT völlig unabhängig von der Bildrate, denn ein Timerevent kann sich höchsten 10-mal zwischen zwei normalen Screen-Updates ereignen.

Beipiel: Bei einer Bildrate von 10 Bildern pro Sekunde kann eine Timerevent nur 100-mal pro Sekunde auftreten. D.h.das kleinste mögliche Timerintervall ist 10 Millisekunden.
Bei einer Bildrate von 20 Bildern pro Sekunde kann eine Timerevent nur 200-mal pro Sekunde auftreten. D.h.das kleinste mögliche Timerintervall ist 5 Millisekunden.

Die Verwendung von zu vielen verschiedenen Timern kann zu Performanceproblemen führen, dazu zu oft zwischendurch Screen-Updates durchgeführt werden müssen.