Keine Lust auf türkis?

Thomas Aull :: Design + Code

9

AS3 - Eigene Events verwenden

Artikel vom 13. Juli 2009, von Thomas Aull in der Kategorie Flash & Actionscript

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:

Download der Beispieldateien

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:

ActionScript 3
// 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:

ActionScript 3
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:

ActionScript 3
// 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:

ActionScript 3
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:

ActionScript 3
// 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);
};

Download der Beispieldateien

9 Kommentare

Kommentar schreiben Kommentare als RSS-Feed

Timo schreibt am 8. September 2009 um 2:19 Uhr:

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!

#1

Thomas Aull schreibt am 5. Oktober 2009 um 15:32 Uhr:

Ach quatsch :-) Wenn man da einmal durchgestiegen is, ist das im Grunde alles ganz logisch ;-)

#2

Jürgen schreibt am 21. Januar 2010 um 12:47 Uhr:

2 Daumen nach oben!

#3

golo schreibt am 30. April 2010 um 11:10 Uhr:

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

#4

Thomas Aull schreibt am 30. April 2010 um 11:24 Uhr:

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 :-)

#5

Tom schreibt am 31. März 2011 um 10:12 Uhr:

Danke. Endlich bin ich mal mit eigenen Events vorangekommen. Eine Frage hab ich dennoch:
Ich adde meinen Listener in meiner Main-Class und möchte nun eigentlich den Event aus einer Navigation-Class dispatchen. Der wird aber leider nicht abgefeuert. Wie kann ich also aus einer Unterklasse einen Event dispatchen dessen Listener irgendwo anders liegt?

#6

Tom schreibt am 31. März 2011 um 10:17 Uhr:

Aha. Einfach mal weiter googlen ;)
Die Lösung für mein Problem von oben:
anstatt nur “dispatchEvent…” muss ich mich natürlich auf die Klasse oder den Clip beziehen der den Listener enthält. Also “ClipDerListenerEnthält.dispatchEvent…”
Dir aber vielen Dank für das tolle Tutorial.

#7

Thomas Aull schreibt am 31. März 2011 um 13:45 Uhr:

Freut mich wenn dus geschafft hast und das Tutorial dir dabei geholfen hat ;-)

#8

Thomas Aull schreibt am 6. Februar 2012 um 15:11 Uhr:

Die Kommentare habe ich deaktiviert, weil über diesen Artikel ziemlich viel SPAM reinkam. Wenn’s noch fragen gibt, schreibt mir ne eMail!

#9
Die Kommentare für diesen Beitrag sind deaktiviert!