Rheinwerk Design < openbook > Rheinwerk Design - Know-how für Kreative.
Know-how für Kreative

 << zurück
ActionScript 1 und 2 von Sascha Wolter (http://www.saschawolter.de/)
Objektorientierung und Codedesign mit Flash MX 2004
Buch: ActionScript 1 und 2

ActionScript 1 und 2
672 S., mit CD, Referenzkarte, 44,90 Euro
Rheinwerk Design
ISBN 3-89842-221-6
gp Kapitel 12 Ereignisse
  gp 12.1 Vor- und Nachteile
    gp 12.1.1 Vor- und Nachteile von Ereignisprozeduren
    gp 12.1.2 Vor- und Nachteile von Ereignismethoden
    gp 12.1.3 Vor- und Nachteile von Ereignismethoden in Flash 5
    gp 12.1.4 Vor- und Nachteile von Listener
  gp 12.2 Reihenfolge der Ereignisse
    gp 12.2.1 Bildbasierte Ereignisreihenfolge
    gp 12.2.2 Bildunabhängige Ereignisreihenfolge
    gp 12.2.3 updateAfterEvent
    gp 12.2.4 setInterval
    gp 12.2.5 initClip
    gp 12.2.6 _changed
  gp 12.3 Ereignisprozeduren
    gp 12.3.1 Fehlerquelle
    gp 12.3.2 on
    gp 12.3.3 onClipEvent
  gp 12.4 Ereignismethoden
    gp 12.4.1 allowDomain
    gp 12.4.2 allowInsecureDomain
    gp 12.4.3 onActivity
    gp 12.4.4 onChanged
    gp 12.4.5 onClose
    gp 12.4.6 onConnect
    gp 12.4.7 onData
    gp 12.4.8 onDragOut
    gp 12.4.9 onDragOver
    gp 12.4.10 onEnterFrame
    gp 12.4.11 onID3
    gp 12.4.12 onKeyDown
    gp 12.4.13 onKeyUp
    gp 12.4.14 onKillFocus
    gp 12.4.15 onLoad
    gp 12.4.16 onMouseDown
    gp 12.4.17 onMouseMove
    gp 12.4.18 onMouseUp
    gp 12.4.19 onPress
    gp 12.4.20 onRelease
    gp 12.4.21 onReleaseOutside
    gp 12.4.22 onRollOut
    gp 12.4.23 onRollOver
    gp 12.4.24 onScroller
    gp 12.4.25 onSelect
    gp 12.4.26 onSetFocus
    gp 12.4.27 onSoundComplete
    gp 12.4.28 onStatus
    gp 12.4.29 onSync
    gp 12.4.30 onUnload
    gp 12.4.31 onUpdate
    gp 12.4.32 onXML
  gp 12.5 Listener
    gp 12.5.1 Listener simulieren
    gp 12.5.2 AsBroadcaster
    gp 12.5.3 onChanged
    gp 12.5.4 onKeyDown
    gp 12.5.5 onKeyUp
    gp 12.5.6 onMouseDown
    gp 12.5.7 onMouseMove
    gp 12.5.8 onMouseUp
    gp 12.5.9 onMouseWheel
    gp 12.5.10 onResize (Stage)
    gp 12.5.11 onScroller(target)
    gp 12.5.12 onSetFocus (Selection)


Rheinwerk Design - Zum Seitenanfang

12.2 Reihenfolge der Ereignisse  downtop

Reihenfolge testen

Da die Reihenfolge der Ereignisabarbeitung von Macromedia nicht dokumentiert ist, kann es leider auch zu Änderungen dieser kommen! Ein regelmäßiger Test ist darum unerlässlich.

Der Nachrichtenfluss, also die Reihenfolge, in der Flash die Ereignisse abarbeitet, ist von zentraler Bedeutung. Denn nicht selten entstehen Fehler dadurch, dass Flash einzelne Anweisungen zu früh, zu spät oder gar nicht ausführt.

Schritte der bildbasierten Ereignisbearbeitung

Rheinwerk Design - Zum Seitenanfang

12.2.1 Bildbasierte Ereignisreihenfolge  downtop

Die bildbasierte Ereignisabarbeitung erfolgt im Wesentlichen in den folgenden Schritten, wie in Abbildung 12.1 gezeigt:

1. Bei der bildbasierten und durch die Abspielgeschwindigkeit vorgegebenen Abarbeitung der Anweisungen beginnt Flash vor der Darstellung des Bildes mit den bereits vorhandenen Movieclips (dies macht erst nach dem ersten Bildwechsel in einer Anwendung Sinn) und sendet diesen die Nachricht onEnterFrame.
       
2. Erst dann geht es an die in den Schlüsselbildern platzierten Skripte, die von oben nach unten abgearbeitet werden (Bildskripte); so als ob alle Anweisungen in nur einem Schlüsselbild hintereinander weg aufgeführt wären.
       

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 12.1   Bildbasierte Ereignisreihenfolge

3. Jetzt startet Flash mit der Darstellung von hinten nach vorne (bzw. von unten nach oben)!
       
4. Noch bevor die in der Anwendung enthaltenen Movieclips angezeigt werden, führt Flash die Anweisungen in der Ereignisprozedur onLoad gefolgt von den Anweisungen in den Ereignismethoden onLoad aus – wie bereits erwähnt, beginnt Flash dabei mit dem hintersten Element.
       
5. Und noch bevor es zum nächsten Movieclip geht, arbeitet Flash die Inhalte des Movieclips ab. Flash beginnt also für jeden Movieclip wieder von vorne und schaut, ob bereits Movieclips enthalten sind, arbeitet dann die Bildskripte ab usw.
       
6. Erst dann geht es zum naechsten Movieclip, und anschliessend erfolgt wieder ein Bildwechsel.
       

Etwas verwirrend ist, dass Flash bei Ereignissen wie onEnterFrame und onMouse- Up in der Reihenfolge genau andersherum agiert und die Movieclips, die weiter oben liegen, bevorzugt abarbeitet.


Rheinwerk Design - Zum Seitenanfang

12.2.2 Bildunabhängige Ereignisreihenfolge  downtop

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 12.2   Bildunabhängige Ereignisreihenfolge

Flash arbeitet immer zuerst alle Ereignisprozeduren gefolgt von den Ereignismethoden ab. Je nach Ereignis beginnt Flash mit den hintersten (onLoad) oder mit den vordersten Objekten. Erst dann kommen die Listener an die Reihe. Die Abarbeitungsreihenfolge bei den Listenern entspricht momentan der Anmeldereihenfolge. Die zuerst angemeldeten Objekte behandelt ActionScript dabei zuerst. Dafür gibt es aber keine Garantie, und Macromedia könnte dieses Verhalten somit jederzeit wieder ändern.

Um auf die Ereignisse und die Ereignishierarchie weitergehenden Einfluss zu nehmen, verwenden Sie die im Folgenden vorgestellten Anweisungen updateAfterEvent, setInterval und initClip oder die Endung _changed in einer Bildbezeichnung.


Rheinwerk Design - Zum Seitenanfang

12.2.3 updateAfterEvent  downtop

Die seit Flash 5 verfügbare Funktion updateAfterEvent(); ist die einzige Möglichkeit in Flash, die Darstellung auf der Bühne unabhängig von der eingestellten Bildrate zu beeinflussen.

Dies macht nur bei Anweisungen Sinn, die unabhängig von der Abspielgeschwindigkeit ausgelöst werden, wie z.B. bei Benutzerinteraktionen. Anders als in der Dokumentation beschrieben funktioniert die Anweisung mit Ereignisprozeduren, Ereignismethoden, Listenern und setInterval. Bei den Ereignisprozeduren und Ereignismethoden beschränkt sich diese Anweisung jedoch auf die Movieclip-Ereignisse (onClipEvent).

Im folgenden Beispiel dreht sich ein »selbst definierter Mauszeiger« (mcMouse) immer in Richtung eines anderen Movieclips (mcMitte). Dies geschieht unabhängig von der eingestellten Bildrate (das Beispiel auf der CD-ROM besitzt eine Bildrate von 0,1 Bild pro Sekunde, bzw. es wird nur alle zehn Sekunden ein Bildwechsel durchgeführt):

mcMouse.onMouseMove = function() {
updateAfter Event.fla
   // Bestimme Winkel bzgl. Mitte
   this.rad = Math.atan2(_root.mcMitte._y-this._y, _root.mcMitte._x-this._x);
   this._rotation = this.rad/(Math.PI/180)-270;
   // Positioniere auf dem Mauszeiger
   this._x = _root._xmouse;
   this._y = _root._ymouse;
   // Zeige unabhängig von der Bildrate
   updateAfterEvent();
};

Rheinwerk Design - Zum Seitenanfang

12.2.4 setInterval  downtop

setInterval ermöglicht Ihnen den regelmäßigen und zeitgesteuerten Aufruf von Funktionen und Methoden. Sie legen eine Zeitdauer in Millisekunden fest, in der eine Funktion oder eine Methode aufgerufen werden soll. ActionScript wiederholt diesen Aufruf in dem von Ihnen festgelegten Intervall so lange, bis Sie das Intervall mit clearInterval wieder löschen.

Da die Intervallangabe in Millisekunden erfolgt, findet die Abarbeitung im Zusammenspiel mit updateAfterEvent(); unabhängig von der Bildrate statt. Um genau zu sein: updateAfterEvent(); hilft nur bei einer Intervallfolge, die schneller als die Bildrate ist. Wenn Sie z.B. eine Bildrate von einem Bild pro Sekunde haben, also jedes Bild genau 1000 Millisekunden angezeigt wird, dann wird ein Intervall mit einer kürzeren Dauer von z.B. 100 Millisekunden entsprechend zehnmal pro Bild aufgerufen, was bei updateAfterEvent(); auch zu einer Veränderung der Darstellung führen kann. Bei dieser Vorgehensweise kam es beim Test jedoch in den meisten Fällen zu einer massiven Verlangsamung der Darstellung.

// Lege Intervall mit anonymer Funktion als Parameter fest
setInterval(function () {_root.mcKuh._x++;
 updateAfterEvent();}, 50);

Sollte ein Intervall länger dauern als die Darstellung eines Bildes, dann führt Flash die zugehörigen Anweisungen ähnlich einem onEnterFrame beim nächsten Eintritt in ein Bild aus, so dass updateAfterEvent(); nicht benötigt wird.

Arten der Anwendung

Die Anwendung von setInterval erfolgt auf zwei unterschiedliche Arten: entweder mit einer Funktion oder mit einem Objekt und einer zugehörigen Methode als Parameter. Im folgenden Beispiel wird alle zwei Sekunden eine Funktion aufgerufen:

werdeWahnsinnig = function () {
setInterval.fla
   mcKuh.gotoAndPlay("wahnsinnig");
};
// id ist die Kennung des Intervalls für clearInterval
id = setInterval(werdeWahnsinnig, 2000);

Um Parameter an die Funktion durchzureichen, verwenden Sie die folgende Schreibweise:

werdeWahnsinnig = function (obj, bild) {
   mcKuh.gotoAndPlay(bild);
};
id = setInterval(werdeWahnsinnig, 2000, mcKuh,"wahnsinnig" );
alternative Schreibweise

Anstelle der Funktionsschreibweise sieht eine vergleichbare Schreibweise mit einem Objekt, einer Methode und mit einem angehängten Parameter wie folgt aus:

id = setInterval(mcKuh, "gotoAndPlay", 2000 ,"wahnsinnig" );

Es ist Zufall, dass es sich bei dem Objekt im letzten Beispiel um einen Movieclip und eine bereits vordefinierte Methode handelt. Genauso gut hätten hier auch ein selbst definiertes Objekt und eine dazu passende Methode stehen können.

Löschen

Das Löschen eines Intervalls geschieht über dessen ID, die von setInterval zurückgegeben wird. Diese ID geben Sie als Parameter von clearInterval an:

id = setInterval(mcKuh, "gotoAndPlay", 500 ,"wahnsinnig" );
// Löschen eines Intervalls bei Klick
mcKuh.onRelease=function () {
   clearInterval(_root.id);
 }

Im Test zeigte sich übrigens, dass Flash die Intervalle einfach nur durchzunummerieren scheint: Die Angabe der Zahl 1 bei clearInterval reicht ebenfalls aus, um das zuerst definierte Intervall zu löschen.


Rheinwerk Design - Zum Seitenanfang

12.2.5 initClip  downtop

Die Anweisung #initclip wird normalerweise im Zusammenspiel mit Komponenten verwendet, um Initialisierungsanweisungen durchzuführen (siehe Kapitel 17, »Komponenten«). Aber auch ohne Komponenten kann der Einsatz vom #initclip hilfreich sein, um die Initialisierung von Movieclips zu steuern.

Da diese Anweisung nur im ersten Schlüsselbild eines Movieclips zulässig ist, gibt Flash in allen anderen Fällen die folgende oder eine ähnliche Meldung aus: »Szene=Szene 1, Ebene=actionscript, Bild=1: Zeile 1: #initclip/#endinitclip nur zulässig bei Bild 1 der Movieclip-Symbole.«

Außerdem wird jeder durch #initclip und #endinitclip eingerahmte Block nur genau einmal ausgeführt. Handelt es sich um ein exportiertes Symbol, dann führt Flash die Aktionen unmittelbar vor dem ersten Bild aus. Sonst kommen die Initialisierungsanweisungen ins Spiel, sobald das Symbol zum ersten Mal verwendet wird. In diesem Fall werden die Anweisungen unmittelbar vor den Bildaktionen ausgeführt.

Das folgende Skript initialisiert eine Klasse (Kuh), welche die Fähigkeiten und Eigenschaften von der Movieclip-Klasse erbt sowie mit einem Symbol (Kuhsymbol) verbunden ist. Dies führt dazu, dass jede Instanz dieses Symbols die neu programmierten Fähigkeiten erhält, ohne dass sich das auf andere Movieclips auswirkt:

#initclip
mit Clip.fla
function Kuh () {
   super();
}
Kuh.prototype=new MovieClip();
Kuh.prototype.werdeWahnsinnig=function () {
   this.gotoAndStop("wahnsinnig");
}
Kuh.prototype.onLoad=function () {
   this.stop();
}
Kuh.prototype.onPress=function () {
   this.werdeWahnsinnig();
 }
Object.registerClass("kuhsymbol", Kuh);
#endinitclip

Bei mehreren Initialisierungsblöcken reicht die Angabe einer Zahl in der Form #initclip 5, um die genaue Reihenfolge zu bestimmen.

Sollte Ihnen das an dieser Stelle zu schnell gegangen sein, dann empfehle ich Ihnen einen Blick in das Kapitel »Komponenten« (siehe Seite 426) und das Studium des Kapitels »Movieclips« mit der Erklärung der Anweisung Object.registerClass (siehe Seite 362).


Rheinwerk Design - Zum Seitenanfang

12.2.6 _changed  toptop

_changed

Wenn der Benutzer ein Textfeld ändert, können gezielt Aktionen ausgeführt werden. Alles, was man dafür seit Flash 5 braucht, ist ein Textfeld, das mit einer Variablen verbunden ist, und ein Schlüsselbild in derselben Zeitleiste mit der Bildbezeichnung variablenname_changed. Das Entscheidende ist die Zeichenkette _changed direkt hinter dem Variablennamen des Textfeldes in der Bildbezeichnung. Alle Aktionen, die in diesem Bild liegen, werden ausgeführt, sobald ein Anwender den Inhalt des Textfeldes verändert. In unseren Tests erwies sich diese undokumentierte Funktion aber zu Recht als undokumentiert: Zahlreiche Abstürze verhinderten allzu oft den Einsatz. Verwenden Sie stattdessen die Ereignismethode oder den Listener namens onChanged.

 << zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: ActionScript 1 und 2
ActionScript 1 und 2
bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: JavaScript






 JavaScript


Zum Rheinwerk-Shop: jQuery






 jQuery


Zum Rheinwerk-Shop: Responsive Webdesign






 Responsive Webdesign


Zum Rheinwerk-Shop: Suchmaschinen-Optimierung






 Suchmaschinen-
 Optimierung


Zum Rheinwerk-Shop: Schrödinger lernt HTML5, CSS3 und JavaScript






 Schrödinger lernt
 HTML5, CSS3
 und JavaScript


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern