Das Ereigniskonzept in AS3, Abonnement-Metapher

 

Zur Laufzeit eines Programms können Ereignisse (Events) auftreten, auf die das Programm reagieren kann.

Grundsätzlich wird zwischen

  • built-in events, die Zustandsänderungen in der Laufzeitumgebung beschreiben, und
  • custom events, die Änderungen im Programmzustand beschreiben,

unterschieden.

Für den Anfang sind nur die built-in events relevant und davon gibt es sehr viele. Typische built-in events sind

  • Mausereignisse, wie das Bewegen der Maus, das Drücken und Loslassen einer Maustaste, das Bewegen des Mauszeigers über ein Anzeigeobjekt,
  • Tastaturereignisse, wie das Drücken und Loslassen einer Tastaturtaste,
  • das ENTER_FRAME-Ereignis, wenn der Abspielkopf in der Timeline in das nächste Bild springt,
  • Timer-Ereignisse, die nach Ablauf einer vorgegebenen Zeitspanne eintreten,
  • Ladeereignisse, die während des Ladevorgangs von swf- und anderen Dateien auftreten.

Custom events beziehen sich auf den Inhalt des Programms. Diese Ereignisse werden von den ProgrammiererInnen definiert. Z.B. ein Ereignis, das eintritt, wenn ein bestimmter Punktestand in einem Spiel erreicht ist oder ein ausgefülltes Formular abgeschickt wird.

Immer wenn ein built-in Ereignis eintritt, wird automatisch ein Ereignisobjekt von der Klasse Event (oder deren Subklassen) erzeugt. 

 
Abonnement-Metapher

Bei jedem Ereignis (event) wird ein Ereignisobjekt (event object) erzeugt. Aber wer kann mit diesem Ereignisobjekt etwas anfangen?
Um den Vorgang zu verstehen, ist der Metapher des Abonnements sehr hilfreich.

Ein Objekt kann einen bestimmten Ereignistyp abonnieren. Das Objekt wird als Ereignisziel oder event target bezeichnet. Beim Vorgang des Abonnierens übergibt das Ereignisziel mit dem Befehl addEventListener dem Ereignistyp einen event listener.
Ein event listener (auch Ereignisprozedur oder event handler genannt) ist eine vorher definierte Funktion, die beschreibt, was zu tun ist, wenn ein Ereignis von dem bestimmten Typ eintritt. Ein event listener erhält als einzigen Input eine Instanz des Ereignisklasse.

Wenn nun ein Ereignis von dem abonnierten Ereignistyp eintritt,

  • wird für das konkrete Ereignis eine Instanz der entsprechenden Ereignisklasse erzeugt,
  • der event listener wird verständigt,
  • erhält als Eingabe die Instanz der Ereignisklasse und
  • und reagiert auf das Ereignis, d.h. der Programmcode der Funktion wird abgearbeitet.
Über die Eigenschaft target des Ereignisobjekts kann der event listener auf die Eigenschaften und Methoden des event targets zugreifen.

Das Abonnement kann wieder abbestellt werden, indem das Ereignisziel mit dem Befehl removeEventListener den event listener wieder aus der Liste der Abonnenten herausnimmt.

Natürlich können mehrere Objekte denselben Ereignistyp abonnieren und auch den denselben event listener verwenden.

 
Allgemeine Code-Struktur für das Event-Handling

Die Platzhalter sind fett geschrieben.

Definition des event listeners:
 

function eventListener (eventObject:EventType): void {
...
Programmcode, der die als Reaktion auf das Ereignis auszuführenden Aktionen angibt
und
eventObject.target enthalten kann
...
}

 
Ein Objekt (event target) abonniert einen bestimmten Eventtyp (= registrieren des event listeners):
 

eventTarget.addEventListener(EventType.EVENT_NAME, eventListener);

 
Ein Objekt (event target) storniert das Abonnement für einen bestimmten Eventtyp:
 

eventTarget.removeEventListener(EventType.EVENT_NAME, eventListener);

 
Wichtig ist, dass der EventType vom event listener mit dem EventType bei add/removeEventListener übereinstimmt.

 
Beispiel

In einer Flashdatei ist im Mainmovie auf der Bühne ein Movieclip mit dem Instanznamen kreis platziert und im ersten Bild in der Maintimeline steht folgendes Skript:
 

function enterFrameListener(e:Event):void {
trace(e.target);
}
this.addEventListener(Event.ENTER_FRAME,enterFrameListener);
kreis.addEventListener(Event.ENTER_FRAME,enterFrameListener);

Zuerst wird eine Ereignisprozedur enterFrameListener definiert mit dem Ereignistyp Event als Input. Die Funktion macht nichts anderes als
mit der trace-Funktion das Ereignisziel e.target im Ausgabefenster anzuzeigen. (Die Eigenschaft target wird im letzten Kapitel genau behandelt.)
Anschließend abonniert das Mainmovie (bezeichnet durch this) mit this.addEventListener(Event.ENTER_FRAME,enterFrameListener) das Ereignis ENTER_FRAME, das immer eintritt, wenn der Abspielkopf in ein neues Bild wechselt.
genauso abonniert die Movieclipinstanz kreis dasselbe Ereignis. Beide Objekte benutzen dieselbe Ereignisprozedur enterFrameListener.

Nach dem Starten des Programms wird im Ausgabefenster bei jedem ENTER_FRAME-Ereignis folgendes ausgegeben:
 

[object MainTimeline]
[object Kreis]
 
Da sowohl das Mainmovie als auch die Movieclipinstanz kreis das Ereignis ENTER_FRAME abonniert haben und werden sie als Ereignisziele im Anzeigefenster ausgegeben.

 

Vertiefende Beispiele zu ENTER_FRAME-Ereignissen findet man im Modul Animation