Events sind ein nützliches Werkzeug in ActionScript3 um Programmabläufe erst zu einem bestimmten Zeitpunkt auszuführen. Ein einfaches Beispiel: Der Benutzer klickt auf einen Button und ein Link wird geöffnet. Für diesen und viele andere Fälle hat Flash voreingestellte Events. Irgendwann, gerade wenn man eigene Klassen oder sogar ein eigenes Framework entwickelt, kommt man aber an den Punkt wo man denkt „Hmm, dafür wär jetzt ein eigenes Event echt praktisch”. Das ist zum Glück kein Problem - wenn man weiß wie´s geht:
Zuerst die Basics: Wie werden Events verwendet?
Ein voreingestelltes Event zu nutzen ist ganz einfach. Bleiben wir bei dem Beispiel mit dem Button: Sobald der Nutzer auf die Schaltfläche „openLink_btn" klickt, soll etwas passieren. Das ganze funktioniert so:
// EventListener
openLink_btn.addEventListener(MouseEvent.CLICK, machWas);
// Eventfunktion
function machWas() {
// Rufe eine URL auf
navigateToURL(new URLRequest("http://www.thomas-aull.de", "_self"));
}
Wir sagen einem EventListener, dass er die ganze Zeit auf den Button „openLink_btn” horchen soll, ob der Nutzer mit der Maus draufklickt. Tritt dieser Fall ein, soll er die Funktion „machWas” aufrufen.
Jetzt geht´s ans Eingemachte: eigene Events schreiben...
...was schon ein wenig schwieriger ist. Ein wenig Grundwissen in Objektorientierter Programmierung kann nicht schaden um den kompletten Vorgang zu verstehen.
Zuerst erzeugen wir unsere eigene Eventklasse, die die Flash-Eventklasse erweitert. Grob gesagt: Wir nehmen die Eventklasse von Flash und packen unseren Code einfach dazu. Dieser Code muss in einer eigenen .as-Datei mit dem Namen „MeinEvent.as" abgelegt werden:
package {
// Import der Flash Eventklasse
import flash.events.*;
public class MeinEvent extends Event {
// Eventarten, bekanntes Beispiel: MouseEvent.CLICK
public static const TESTEREIGNIS:String = "TESTEREIGNIS";
// Variable in denen wir zusätzliche Eventdaten speichern können
public var data;
// Der Konstruktor
public function MeinEvent(type:String, data) {
super(type);
this.data = data;
};
};
};
Als nächstes erzeugen wir eine neue Flash-Datei (AS3) und packen folgenden Code in das erste Schlüsselbild:
// Wir sagen Flash, dass wir unsere Klasse "MeinEvent" benutzen wollen
import MeinEvent;
// Wir fügen einen EventListener wie im Beispiel oben hinzu
addEventListener(MeinEvent.TESTEREIGNIS, machWas)
// Hier feuern wir unser Event ab
dispatchEvent(new MeinEvent(MeinEvent.TESTEREIGNIS, null));
// Die Funktion die dann durch den EventListener aufgerufen wird
function machWas(e:MeinEvent) {
trace("Das Event funktioniert!");
};
Zuerst sagen wir Flash, dass wir unsere Klasse "meinEvent" verwenden wollen. Anschließend schreiben wir einen normalen EventListener wie im MouseEvent-Beispiel oben. Wir sagen hier aber, dass er auf das Event „MeinEvent” und den Eventtyp „TESTEREIGNIS” hören soll. Tritt dieser Fall ein, soll er die Funktion „machWas” aufrufen.
Weil jetzt aber niemand außer uns weiß, wann das Event genau aufgerufen werden soll, müssen wir das selbst machen. Das ist der sogenannte „Event-Dispatcher”. Der sagt, dass bitteschön jetzt unser Event „MeinEvent” mit dem Eventtyp „TESTEREIGNIS” abgefeuert werden soll. Wir wollen keine weiteren Eventdaten übergeben (= null).
Wenn wir den Film jetzt starten, bekommen wir einen trace mit dem Inhalt "Das Event funktioniert!". Wichtig dabei ist, dass alle Dateien im gleichen Verzeichnis liegen!
Und jetzt?
Das war die eigentliche Grundlogik. Wir können unsere Events aber noch um folgende Punkte ergänzen:
Mehrere Eventtypen verwenden: Um weitere Eventtypen verwenden zu können, müssen wir einfach unsere Eventklasse um die entsprechenden Variablen erweitern. Wenn wir anstatt des Eventtyps „TESTEREIGNIS” auch noch „USERINTERKATION” und „BILD_GELADEN” abfragen möchten, hinterlegen wir diese einfach in unserer Klasse:
package {
// Import der Flash Eventklasse
import flash.events.*;
public class MeinEvent extends Event {
// Eventarten, bekanntes Beispiel: MouseEvent.CLICK
public static const TESTEREIGNIS:String = "TESTEREIGNIS";
public static const USERINTERAKTION:String = "USERINTERAKTION";
public static const BILD_GELADEN:String = "BILD_GELADEN";
// Variable in denen wir zusätzliche Eventdaten speichern können
public var data;
// Der Konstruktor
public function MeinEvent(type:String, data) {
super(type);
this.data = data;
};
};
};
Eventdaten übergeben: Häufig ist es auch erforderlich an das Event verschiedene Daten anzuhängen die für die Weiterverarbeitung nötig sind. In unsere Eventklasse haben wir dafür schon die nötige Variable „data” hinterlegt. Wir müssen im Dispatcher einfach noch die Daten übergeben. In unserer Eventfunktion können wir diese Daten dann auslesen:
// EventListener
addEventListener(MeinEvent.TESTEREIGNIS, machWas)
// Dispatcher mit Eventdaten füttern...
var data:Object = new Object;
data.name = "Max Mustermann";
data.alter = 21;
// ...und abfeuern
dispatchEvent(new MeinEvent(MeinEvent.TESTEREIGNIS, data));
// Eventfunktion: Daten auslesen
function machWas(e:MeinEvent) {
trace(e.data.name);
trace(e.data.alter);
};