Keywords

Animation mit einem Event-Handler für das ENTER_FRAME-Ereignis

In diesem Kapitel wird die Animation unter Verwendung eines Eventhandlers für das ENTER_FRAME-Ereignis erstellt.
Immer wenn der Abspielkopf ein neues Frame betritt, wird das Ereignis ENTER_FRAME ausgelöst.
Bei einer Bildrate von z.B. 15 Bildern in der Sekunde tritt dieses Ereignis 15-mal in der Sekunde auf.
Das passiert, auch wenn es nur im ersten Frame der Timeline Schlüsselbilder gibt oder der Abspielkopf in einem Frame gestoppt wurde.

Siehe auch ActionScript3: Ereigniskonzept und Eventhandler - eine kurze Einführung

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

1. Initialisierungblock, in dem Variable initialisiert 
und eventuell für Movieclips die Startwerte für bestimmte Eigenschaften gesetzt werden
 
2. Zuordnung des Eventlisteners:
eventTarget.addEventListener(Event.ENTER_FRAME, enterFrameListener);
 
3. Defintion des Eventlisteners, der auch das Entfernen des Eventlisteners enthält:
function enterFrameListener(e:Event):void {
relative Veränderung von MovieClip-Eigenschaften (das ist der zentrale Punkt für die Animation)
if (Abbruchkriterium für die Animation ist erfüllt) {
abschließende Aktionen
eventTarget.removeEventListener(Event.ENTER_FRAME, enterFrameListener);
}
}

Im nachfolgenden Beispiel gibt es nur ein Skript im ersten Frame der Maintimeline.

 

 

Beim Movieclip Kreis in der Bibliothek muss Export für ActionScript aktiviert sein.

Schritt 1: Initialisierungsblock

Erzeugen einer Kreisinstanz und platzieren am linken Bühnenrand:

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

Die Schrittweite in einer Variablen abspeichern:

var speed:Number = 10;

 

Schritt 2: Zuordnung des Eventlisteners

Die Kreisinstanz "abonniert" das Ereignis ENTER_FRAME. Der Instanz kreis_mc wird der Eventlistener (Eventhandler) bewegeKreis zugeordnet, der auf das Ereignis ENTER_FRAME "horcht". D.h. immer wenn das Ereignis ENTER_FRAME eintritt, wird der Eventlistener  bewegeKreis aufgerufen.

kreis_mc.addEventListener(Event.ENTER_FRAME, bewegeKreis);

Variante: Das Mainmovie (die Maintimeline) erhält den Eventlistener. Über this wird in diesem Fall die Maintimeline angesprochen.

this.addEventListener(Event.ENTER_FRAME, bewegeKreis);

 

Schritt 3: Definition des Eventlisteners (Eventhandlers)

Ein Eventhandler ist eine Funktion, die als Input das auslösende Event erhält. Eventhandler haben keinen Output.

function bewegeKreis(e:Event):void {
e.target.x += speed;
if (e.target.x + e.target.width/2 > stage.stageWidth) {
e.target.x = stage.stageWidth - e.target.width/2;
e.target.removeEventListener(Event.ENTER_FRAME, bewegeKreis);
}
}

Über die Eigenschaft target des Events e (d.h. e.target) kann die Instanz angesprochen werden, die das Ereignis abonniert hat. In diesem Fall ist damit die Instanz kreis_mc gemeint, deren x-Koordinate um den Wert von speed erhöht wird.

Wenn der Kreis den rechten Rand erreicht hat, muss er nicht mehr auf das Ereignis ENTER_FRAME horchen und daher wird in diesem Fall der Eventlistener mit e.target.removeEventListener(Event.ENTER_FRAME, bewegeKreis) entfernt. D.h. "das Abonnement des Ereignisses wird storniert".

Variante: Dem Mainmovie (die Maintimeline) wurde der Eventlistener zugeordnet.
In diesem Fall ist mit e.target die Maintimeline gemeint und daher muss man die Instanz kreis_mc explizit in den Eventhandler hineinschreiben.
Der Eventlistener wird in dieser Variante mit this.removeEventListener(Event.ENTER_FRAME, bewegeKreis) von der Maintimeline entfernt.

function bewegeKreis(e:Event):void {
kreis_mc.x += speed;
if (kreis_mc.x + kreis_mc.width/2 > stage.stageWidth) {
kreis_mc.x = stage.stageWidth - kreis_mc.width/2;
this.removeEventListener(Event.ENTER_FRAME, bewegeKreis);
}
}

 

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;

kreis_mc.addEventListener(Event.ENTER_FRAME, bewegeKreis);
function bewegeKreis(e:Event):void {
e.target.x += speed;
if (e.target.x + e.target.width/2 > stage.stageWidth) {
e.target.x = stage.stageWidth - e.target.width/2;
e.target.removeEventListener(Event.ENTER_FRAME, bewegeKreis);
}
}
 
Die Variante 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;

this.addEventListener(Event.ENTER_FRAME, bewegeKreis);
function bewegeKreis(e:Event):void {
kreis_mc.x += speed;
if (kreis_mc.x + kreis_mc.width/2 > stage.stageWidth) {
kreis_mc.x = stage.stageWidth - kreis_mc.width/2;
this.removeEventListener(Event.ENTER_FRAME, bewegeKreis);
}
}