Ereignisse

Möchte man einen Flash-Film interaktiv werden lassen muss man festlegen können, zu welchem Zeitpunkt bestimmte Anweisungen ausgeführt werden - dazu benutzt man Ereignisse (events). Man unterscheidet zwischen selbstauslösenden Ereignissen - z.B. wenn ein MovieClip geladen wurde (onLoad) oder wenn der Bildschirm neu gezeichnet wird (onEnterFrame) - und benutzerdefinierten Ereignissen - z.B. wenn die Maus bewegt wird oder wenn der Benutzer eine Taste drückt. Interaktivität wird also erreicht, indem man festlegt welcher Code ausgeführt werden soll, wenn/sobald ein bestimmtes Ereignis eintritt.

//Der auszuführende Code//
Schauen wir uns zunächst an, wie man diese //Reaktion// auf ein Ereignis programmiert. Eigentlich ist das nichts besonderes, es braucht nur eine Funktion, also sozusagen einen benannten Codeblock (genaueres zu Funktionen). Wenn beispielsweise als Reaktion auf ein Ereignis einfach "Hallo" ausgegeben werden soll, dann muss der zugehörige Code (nämlich //trace("Hallo")//) in geschweifte Klammern eingeschlossen werden, vor denen noch Name und Typ der Funktion definiert werden, also code format="actionscript" function sagHallo:void { //diese Funktion heisst "sagHallo", benötigt keine Informationen (leere Klammern) und gibt auch keine zurück (void) { trace("Hallo");   //hier kann beliebiger Code stehen. Er wird ausgeführt, wenn man die Funktion aufrufe - üblicherweise mit dem Code sagHallo } code Diese allgemeine Funktion muss nur minimal abgewandelt werden, damit sie als Reaktion auf ein Ereignis benutzt werden kann, und zwar aus folgendem Grund: ein Ereignis schickt immer Informationen über sich selbst mit, wenn es eine Funktion aufruft, also muss die aufgerufene Funktion dies erwarten (selbst wenn man mit den Informationen dann gar nichts anfängt). Damit eine Funktion Informationen vom Typ Event erwartet, muss man dies in die Klammern schreiben, also: code format="actionscript" function sagHallo(e:Event):void { //die empfangenen Informationen zum auslösenden Event sind unter dem Namen e abrufbar { trace("Hallo");   //hier kann beliebiger Code stehen. } code

//Verknüpfung von Ereignis und Reaktion//
Die Reaktion ist definiert, jetzt muss man noch dafür sorgen, dass ein bestimmtes Ereignis sie auslöst, z.B. so: code format="actionscript" stage.addEventListener(MouseEvent.CLICK, sagHallo); code mit //addEventListener// sagt man einem Objekt (hier //stage//, also der Bühne), dass es auf ein bestimmtes Ereignis achten soll. In den Klammern gibt man dann an, um welches Ereignis es geht (hier dass mit der Maus auf die Bühne geklickt wird) und welche Funktion dann aufgerufen werden soll (eben die vorher definierte Reaktion). Hier nochmal ein komplettes Beispiel, diesmal geht es um einen Doppelklick auf einen Knopf: code format="actionscript" // Voraussetzung: einKnopf ist eine existierende Instanz function onKnopfDoubleClick(e:MouseEvent):void // Reaktionen benennt man oft nach den Ereignissen, von denen sie ausgelöst werden { trace('Du hast mich doppelt geklickt'); } einKnopf.addEventListener(MouseEvent.DOUBLE_CLICK, onKnopfDoubleKlick); /*Zuordnung von Ereignis und Reaktion zu einer bestimmten Objekt-Instanz, hier einKnopf*/ code

Erweiterung
Manchmal sollen verschiedene Ereignisse, z.B. Klicks auf verschiedene Knöpfe, sehr ähnliche Reaktionen auslösen. Hier kann man sich viel Arbeit sparen, indem man nur eine Reaktion definiert, die man durch Verwendung der Event-Information flexibler gestaltet: code format="actionscript" // Voraussetzung: knopf1, knopf2, knopf3,... sind existierende Instanzen function onKnopfDoubleClick(e:MouseEvent):void // Reaktionen benennt man oft nach den Ereignissen, von denen sie ausgelöst werden { trace('Du hast auf ' + e.target.name + ' doppelt geklickt'); // Die Ausgabe verändert sich jetzt, je nachdem, welcher Knopf die Reaktion ausgelöst hat } knopf1.addEventListener(MouseEvent.DOUBLE_CLICK, onKnopfDoubleKlick); /*Zuordnung von Ereignis und Reaktion zu einer bestimmten Objekt-Instanz, hier knopf1*/ knopf2.addEventListener(MouseEvent.DOUBLE_CLICK, onKnopfDoubleClick); //benutzt dieselbe Reaktion knopf3.add .... //das geht mit beliebig vielen Knöpfen

code Gute (englische) Erklärungen & Illustration zu AS3-Events:
 * @http://gamedev.michaeljameswilliams.com/2009/02/06/using-as3-event-listeners/
 * http://www.republicofcode.com/tutorials/flash/as3events/

Liste üblicher Events
In ActionScript gibt es fürchterlich viele Ereignisse, auf die man in der oben beschriebenen Weise reagieren kann. Details finden sich in der Dokumentation, in den Unterklassen von flash.events (@http://livedocs.adobe.com/flash/9.0_de/ActionScriptLangRefV3/). In dieser Liste habe ich dijenigen zusammengestellt, die sie vermutlich am ehesten brauchen werden
 * ~ Event ||~ Beschreibung ||
 * MouseEvent.CLICK || Ausgelöst, wenn der Benutzer auf das Objekt klickt (= drücken und wieder loslassen) ||
 * MouseEvent.DOUBLE_CLICK || Ausgelöst, wenn der Benutzer auf das Objekt doppelklickt ||
 * MouseEvent.MOUSE_OVER || Ausgelöst, wenn der Mauszeiger über das Objekt fährt ||
 * MouseEvent.MOUSE_OUT || Ausgelöst, wenn der Mauszeiger das Objekt verlässt ||
 * MouseEvent.MOUSE_DOWN || Ausgelöst, wenn die linke Maustaste gedrückt wird (über dem Objekt) ||
 * MouseEvent.MOUSE_UP || Ausgelöst, wenn die linke Maustaste losgelassen wird (über dem Objekt) ||
 * MouseEvent.MOUSE_MOVE || Ausgelöst, wenn/solange sich die Maus bewegt ||
 * MouseEvent.WHEEL || Ausgelöst, wenn/solange sich das Mausrad bewegt ||
 * KeyboardEvent.KEY_DOWN || Ausgelöst, wenn eine (beliebige) Taste gedrückt wird ||
 * KeyboardEvent.KEY_UP || Ausgelöst, wenn eine (beliebige) Taste losgelassen wird ||
 * Event.ENTER_FRAME || Ausgelöst, sobald/immer wenn ein neues Bild erreicht wird, also normalerweise 24 mal pro Sekunde (das ist der Standardwert für Bps - Bilder pro Sekunde - der lässt sich in den Eigenschaften der Bühne verändern). Dieses Ereignis wird insbesondere für Spiele häufig gebraucht, da man hier ständig neu berechnen will, wie das Spiel jetzt aussieht (der Game-loop) ||
 * Event.SOUND_COMPLETE || Ausgelöst, wenn ein Sound zu Ende gespielt hat (Achtung, das Objekt sollte ein SoundChannel sein, nicht der Sound selbst) ||
 * Event.CHANGE || Ausgelöst, wenn der Wert eines Objekts geändert würde. Am gebräuchlichsten mit Eingabe-Textfeldern, hier wird das Ereignis ausgeläst wenn der Benutzer mit seiner Eingabe fertig ist (also wenn er Return drückt oder anderswohin klickt) ||
 * TextEvent.TEXT_INPUT || Ausgelöst, wenn irgendetwas innerhalb eines Textfeldes geändert wird, z.B. wenn ein Buchstabe gelöscht oder zugefügt wird - diese Ereignis ist meist weniger nützlich als das obige Event.CHANGE, das nur einmal am Ende der Eingabe ausgelöst wird ||
 * TimerEvent.TIMER || Ausgelöst für jeden Tick des Timers - also je nach eingestelltem Intervall ||
 * TimerEvent.TIMER_COMPLETE || Ausgelöst, wenn der Timer zu Ende gelaufen ist ||