info@a-coding-project.de

Flash: Movieclips dynamisch erzeugen

In häufigen Fällen wird die im Authoring-Modus auf der Bühne platzierte Menge von Movieclips nicht den Anforderungen eines Filmprojekts gerecht, so dass es erforderlich wird, Movieclipinstanzen dynamisch zur Laufzeit zu erzeugen. Derartig erzeugte Movieclips sind stets Unterknoten (childs) eines übergeordneten Movieclips (parent). Bei Verwendung etwaig noch vorhandener Aktionen ist dies zwingend der Movieclip, in dessen Zeitleiste die Aktion notiert wurde. Bei Verwendung der nach neuerem Modell dazu zur Verfügung stehenden Methoden des Movieclip-Objekts ist dies jedoch der Movieclip, dessen Zielpfad davor notiert wird. Letztere Art und Wiese bringt den Vorteil mit sich, dass dynamisch erzeugte Instanzen auch beliebigen anderen auf der Bühne vorhandenen Movieclips angehängt werden können.
Movieclips können im Allgemeinen mithilfe unterschiedlicher Verfahrensweisen dynamisch erzeugt werden.

Leere Movieclips erzeugen

Eine leere Movieclipinstanz wird durch die Methode createEmptyMovieClip(Instanzname, Tiefe) des Movieclip - Objekts erzeugt, wobei sie hierarchisch dem Movieclip, dessen Zielpfad vor dem Methodenbezeichner notiert wurde, untergeordnet ist. Die Positionierung der so hinzufügten Instanz, deren Namen durch den ersten Parameter festgelegt wird, erfolgt relativ und wird an der oberen linken Ecke des Elternobjekts ausgerichtet. Mit dem zweiten Parameter von createEmptyMovieClip definiert man die Ebenentiefe, d.h. die Nummer der Ebene in der Zeitleiste des Elternmovieclips, in der die Instanz diesem angehängt werden soll. Ein Beispiel:

_root.myMovieClip.createEmptyMovieClip("newMovieClip",5);

In diesem Beispiel wird in Ebene 5 der Zeitleiste des Movieclips myMovieClip eine neue leere Movieclipinstanz mit dem Namen newMovieClip erzeugt. Sie überdeckt nach dem bereits erläuterten Prinzip der transparenten Ebenen (wie Folien) alles, was in der Ebenenhierarchie (Ebene 1 - 4) unter ihr liegt.

Auf der Bühne vorhandene Movieclips vervielfachen

Möchte man Movieclips auf der Bühne des Films während dessen Wiedergabe dynamisch vervielfachen, muss man dazu die Methode duplicateMovieClip(Vorlagenname, Instanzname, Tiefe) des Movieclip - Objekts verwenden. Der Parameter Vorlagenname entspricht dabei dem Zielpfad des zu duplizierenden Movieclips (im Prinzip Vorlage), Instanzname dem Namen der zu erzeugenden Instanz und Tiefe wieder der Ebenentiefe in der Zeitleiste des Elternmovieclips. Auf diese Weise erzeugte Movieclipinstanzen werden stets ab dem ersten Bild ihrer Zeitleiste abgespielt, auch, wenn die Wiedergabe des übergeordneten Movieclips sich in einem anderen Bild befindet. Wird dieser Elternmovieclip entfernt, so wird auch die dynamisch mit duplicateMovieClip erzeugte Instanz gelöscht. Ein Beispiel:

_root.duplicateMovieClip("_root.myMovieClip","newMovieClip",5);

Hier wird im Movieclip des Wurzelknotens (_root) ein Movieclip namens myMovieClip im Unterknoten dupliziert, wobei das Duplikat, d.h. die so erzeugte Instanz, den Bezeichner newMovieClip erhält. Die neue Movieclipinstanz wird dabei in der Ebene 5 der Zeitleiste des übergeordneten Movieclips angehängt.
Eine noch existierende, jedoch verhältnismäßig veraltete, Aktion duplicateMovieClip("_root.myMovieClip","newMovieClip",5) führt zum selben Ergebnis, wobei hier die Instanz nur dem Movieclip angehängt werden kann, in dessen Zeitleiste die Anweisung notiert ist. Ein zu obigem analoges Beispiel:

duplicateMovieClip("_root.myMovieClip","newMovieClip",5);

Symbole der Bibliothek dynamisch instanzieren

Instanzen von Symbolen jeder Art aus der Bibliothek können nur dann mit ActionScript dynamisch erzeugt werden, wenn diese Symbole eine Verknüpfung mit ActionScript erlauben. Andernfalls sind sie für ActionScript nicht sichtbar, da für sie kein Verknüpfungsname existiert.
Um diese Verknüpfung zu gewährleisten, muss man in den Verknüpfungseigenschaften eines Symbols den Export für ActionScript freigeben und einen entsprechenden Symbolbezeichner für ActionScript definieren. Dies kann in der Maske während der Erzeugung des Symbols und den entsprechenden Dialog aus dessen Kontextmenü in der Bibliothek erfolgen.
Mithilfe der Methode attachMovie(Verknüpfungsname, Instanzname, Tiefe [, Vorlagenname]) des Movieclip - Objekts kann eine neue Instanz eines Bibliotheksymbols dynamisch zur Laufzeit erzeugt werden. Der erste erwartete Parameter dieser Methode entspricht dem eben erläuterten Bezeichner des Symbols für dessen Export in ActionScript . Instanzname beschreibt den neuen Namen der Instanz, welche dem übergeordneten Movieclip in der Ebene der entsprechenden Tiefe Tiefe aus dem dritten Parameter angehängt wird. Mit dem letzten Parameter Vorlagenname kann zudem optional der Bezeichner eines Objekts übergeben werden, dessen Eigenschaften die zu erzeugende Instanz erben soll. Folgendes Beispiel zeigt dies:

myObject = new Object();
myObject.var1 = 1;
myObject.var2 = "String";

_root.attachMovie("mySymbol","newMovieClip",5,myObject);

In diesem Beispiel wird zunächst ein neues leeres Objekt myObject erzeugt und anschließend werden zwei Objektvariablen var1 und var2 initialisiert. Mit der vierten Anweisung wird im Movieclip des Wurzelknotens (_root) eine neue Movieclipinstanz namens newMovieClip vom Bibliothekensymbol mySymbol im Unterknoten erzeugt, wobei diese dabei in der Ebene 5 der Zeitleiste des übergeordneten Movieclips angehängt wird. Da als vierter Parameter der Methode attachMovie der Bezeichner des anfangs erzeugten Objekts myObject übergeben wurde, erbt die Instanz newMovieClip dessen Eigenschaften:

trace(_root.newMovieClip.var2);        
//Gibt "String" im Fenster aus

Mit der Methode attachSound("Verknüpfungsname") des Movieclip - Objekts können zudem Soundsymbole der Bibliothek instanziert werden. Der erwartete Parameter dieser Methode entspricht dem Bezeichner eines Sound-Symbols für dessen Export in ActionScript . Zuvor muss jedoch eine neue Instanz des Objekts Sound erzeugt werden. Dem Konstruktor new Sound([Zielpfad]) kann dabei optional der Zielpfad eines Movieclips übergeben werden, welchem die Soundobjektinstanz angehangen werden soll. Wird darauf verzichtet, steuert die Instanz des Sound-Objekts sämtliche Sounds im Flash film. Ein Beispiel:

mySound = new Sound(myMovieClip);
mySound.attachSound("mySoundSymbol");
mySound.start();

Im Beispiel wird zunächst eine neue Instanz des Sound-Objekts mit dem Bezeichner mySound für den Movieclip myMovieClip erzeugt, welchem in der folgenden Anweisung der Sound des Bibliothekensymbols mySoundSymbol hinzugefügt wird. Anschließend wird die Wiedergabe der Sound-Instanz gestartet.

Dynamisch erzeugte Instanzen aus Hierarchie entfernen

Movieclipinstanzen, welche mit der Methode oder Aktion duplicateMovieClip bzw. der Methode attachMovie erzeugt wurden, können mithilfe der Methode removeMovieClip des MovieClip - Objekts wieder gelöscht werden. Es wird hierbei nicht nur der Bühneinhalt der Instanz, sondern auch ihr die Gesamtheit ihrer Eigenschaften gelöscht. Folgende Anweisung würde also die im vorigen Beispiel erzeugte Movieclipinstanz newMovieClip wieder komplett löschen:

_root.myMovieClip.removeMovieClip();

Des Weiteren existiert in ActionScript noch eine eher veraltete Aktion removeMovieclip, welche als Parameter den Zielpfad der zu löschenden Instanz erwartet, jedoch genau das gleiche bewirkt und auch nur auf nach oben erläutertem Prinzip erzeugte Instanzen angewandt werden kann. Ein analoges Beispiel:

removeMovieClip(_root.myMovieClip);

Inhalte verteilen: Externe Inhalte dynamisch in einen Flashfilm laden

Flash unterstützt eine große Bandbreite an Importmöglichkeiten für (Multimedia-) Formate. Dazu zählen zahlreiche Vektor- und Bitmapgrafikformate (z.B.: Adobe Illustrator (AI), (PNG), Bitmap, GIF, TIF, JPEG, PSD, usw.), Videoformate (z.B.: AVI, MPEG, MOV, WMV, usw.) und Audioformate (z.B.: MP3, WMA, WAV, usw.), um nur einige zu nennen.
Einige dieser Formate können darüber hinaus auch dynamisch mit ActionScript eingebunden werden. Der bereits im Kapitel "Hierarchie eines Flash films" angesprochene Aspekt der Verteilung von Inhalten auf mehrere Flash filme, um damit den Speicherbedarf eines Flash films zu minimieren, kommt bei Verwendung der hier erwähnten Methoden bzw. Aktionen zum Tragen.

Grafiken und Videos dynamisch einbinden

Mithilfe der Methode loadMovie("URL" [, Variablen]) des Movieclip- Objekts können JPEG-Bilder und SWF-Filme dynamisch zur Laufzeit importiert werden. Je nachdem, ob man den Zielpfad einer Movieclipinstanz oder eine Stufe des Flash players (_levelX) angibt, wird entweder der existierende Movieclip mit dem entsprechenden Zielpfad ersetzt oder das zu importierende Medium in die angegebene Stufe des Flash players geladen.
Mit dem ersten Parameter URL muss man die absolute oder relativeURLfür das zu ladende Medium übergeben, wobei sich dieses in derselben Subdomain wie der Flash films, welcher das Medium importieren soll, befinden muss. Der relative Pfad muss stets relativ zum Flash film in _level0 angegeben sein.
Einem einzubindenden Flash film kann mit dem letzten optionalen Parameter Variablen zusätzlich noch eine Methode (POST oder GET) angegeben werden, mit welcher diesem Variablen übergeben werden. Bei Verwendung der Methode GET werden die Variablen am Ende derURLnach einem Fragezeichen (?) und bekanntem Codierungsverfahren angehängt, wobei bei POST die Variablen in einem neuen HTTP-Header übertragen werden. Ein Beispiel:

myString = "String";
_level5.loadMovie("src/otherMovie.swf", "GET");

In diesem Beispiel wird ein anderer Flash film mit dem relativen Pfad src/otherMovie.swf in die Stufe 5 des Flash players (_level5) geladen. Der letzte Parameter gibt zudem an, dass die Variablen des Flash films in die Zeitleiste des zu importierenden Films mit der Methode GET übertragen werden sollen. Auf diese Weise stehen diese dort direkt zur Verfügung. Die so zusammengesetzteURLwürde dann src/otherMovie.swf?myString=hallo lauten.
Diese Methode ersetzt seit Einführung von Flash MX die beiden Aktionen loadMovie("URL", Stufe/Zielpfad [, Variablen]) bzw. loadMovieNum("URL", Stufe [, Variablen]).

Sounds dynamisch importieren

Sounds können in ActionScript können mit den Methoden des Sound-Objekts gesteuert werden, so dass man vor dem Einbinden von Sounddateien zunächst eine solche Instanz erzeugen muss. Mit der Methode loadSound("URL", isStream) des Sound-Objekts können MP3-Dateien dynamisch importiert werden, wobei der erste Parameter die relative oder absoluteURLder zu ladenden Datei angibt. Das Parameter isStream muss ein boolescher Wert sein und gibt an, ob es sich um den zu importierenden Sound um einen Stream- (bei Wert true) oder einen Ereignis-Sound (bei Wert false) handelt. Ein Beispiel:

mySound = new Sound(myMovieClip);
mySound.loadSound("src/sound.mp3",false);

Hier wird zunächst eine neue Sound-Instanz mit dem Namen mySound im Movieclip myMovieClip erzeugt. In diese wird dann dynamisch die MP3-Datei mit dem Pfad src/sound.mp3 geladen, welche sich laut zweitem Parameter von loadSound um einen Ereignis-Sound handelt, also erst nach dessen vollständigem Einladen wiedergegeben werden kann.
Um eine Instanz des Sound-Objekts zu steuern, muss man dessen Eigenschaften und Methoden verwenden, welche in der Flash beiliegenden Referenz aufgeführt sind.

Dynamisch geladene Movieclips löschen

Die Methode unloadMovie() des Movieclip - Objekts löscht Movieclips, welche mit loadMovie in den Flash film geladen wurden. Des Weiteren können auch Movieclips, welche mit attachMovie von Symbolen der Bibliothek instanziert wurden, auf diese Weise gelöscht werden. Hierbei wird allerdings nicht wie bei removeMovieClip die gesamte Instanz, sondern nur deren Inhalt gelöscht, so dass diese mit ihren Eigenschaften vorhanden bleibt. Oben geladener Film auf Stufe 5 des Flash films müsste so gelöscht werden:

_level5.unloadMovie();

Es existieren des Weiteren noch die Aktionen unloadMovie (Stufe/Zielpfad) sowie unloadMovieNum(Stufe) zum Löschen mit entsprechender Aktion (loadMovie bzw. loadMovieNum) geladener Movieclips.

Weiterlesen: ⯈ LiveConnect: Das Zusammenspiel von JavaScript und ActionScript

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant