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:
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:
1 2 3 4 5 6 7 8 | // 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.
...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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // 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!
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 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); }; |
AS3 eigene Events - Schnipsel - Code Schnipsel (Snippets) zu Wordpress, PHP, HTML, CSS, jQuery
[…] AS3 nicht ausreichen, kann man sich auch eigene schreiben. Wie das geht erkläre ich in meinem Blog, die Klasse für eigene Events gibts auch hier: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 […]
Timo
Mit der prima Anleitung sieht das ja auf den ersten Blick fast machbar aus. Bin gespannt, wenn ich das ausprobiere gibt’s garantiert wieder ein Disaster… Danke jedenflalls!
Thomas Aull
Ach quatsch :-) Wenn man da einmal durchgestiegen is, ist das im Grunde alles ganz logisch ;-)
[AS3] Problem mir eigenen Event f
[…] […]
Jürgen
2 Daumen nach oben!
golo
Hallo vielen Dank,
ich versuche auch gerade die Event-Klasse zu erweitern, ich scheitere aber an folgendemunkt:
Ich möchte einfach eine bekannte Eventart : MouseEvent.CLIC
mit, wie in Deinem Beispiel mit data erweitern. Um einfach mehr Daten an den Event dran zu hängen…
Aber wie ?
Danke und Gruss Golo
Thomas Aull
Hallo Golo,
den Fall habe ich selbst noch nicht ausprobiert, aber du müsstest dann die MouseEvent- statt die Event-Klasse erweitern. Vielleicht geht´s aber auch viel leichter, dann müsste ich aber wissen was genau du vorhast :-)