MovieClips

Jede Flash-Anwendung besteht aus mindestens einem Movieclip, nämlich der Anwendung selber. Diese Anwendung darf – wie alle anderen Movieclips – eine Reihe an Elementen beinhalten. Dazu zählen auch wieder Movieclips. Ähnlich wie bei den Matrjoschka-Figuren, die ineinander gesteckt weitere Matrjoschka-Figuren enthalten - oder wie Ordner auf der Festplatte eines Computers, die verschiedene Dateien, aber eben auch weitere (Unter-)Ordner enthalten können. Neben den MovieClips gibt es noch eine Reihe weitere Objekte, die MovieClips ähneln, aber auch ein paare abweichende Eigenschaften oder Fähigkeiten aufweisen. In vielerlei Hinsicht kann man beispielsweise Buttons oder Textfelder wie MovieClips behandeln, die sich auf einen bestimmten Einsatzzweck spezialisiert haben.

Was sind MovieClips
Was aber ist ein MovieClip genau? Technisch ausgedrückt ist MovieClip eine Klasse, noch genauer: eine Unterklasse der generischen Objekt-Klasse (eigentlich alles in Flash - und den meisten anderen Programmiersprachen - ist ein Object). Ein MovieClip weiss Dinge (Eigenschaften) und kann Dinge (Methoden), und ein grosser Teil der Programmierarbeit besteht darin, mit diesen Eigenschaften und Methoden zu arbeiten. Alle Objekte haben Eigenschaften und Methoden, aber eben evtl. nicht dieselben wie ein MovieClip. MovieClips sind darüber hinaus besonders, weil jeder seine eigene Zeitleiste enthält und verwaltet. In dieser Zeitleiste können dann beispielsweise Formen oder andere (untergeordnete) MovieClips enthalten sein, die dem Eltern-Clip sein Aussehen verleihen. Da er ja Herr über seine Zeitleiste ist, kann der übergeordnete Clip auch seine Zeitleiste abspielen oder anhalten - das ist eine seiner Fähigkeiten (Methoden). Zu seinen Eigenschaften gehört bspw., dass er sich seine Position und Grösse merkt.

Von Symbolen und Instanzen
Einen MovieClip bekommt man üblicherweise, indem man etwas in ein Symbol umwandelt und als Symboltyp Movieclip wählt. Symbole wohnen in der Bibliothek, d.h. sie sind in der .fla-Datei gespeichert, auch wenn sie vielleicht gar nicht benutzt werden. Um ein Symbol zu benutzen muss man es in die Bühne ziehen - genau genommen erstellt man dabei eine Kopie des Symbols, eine sogenannte Instanz. Diese Instanz kann einen eigenen Namen bekommen (auch das ist eine Eigenschaft), z.B. damit man sie von einer zweiten oder dritten Instanz desselben Symbols unterscheiden kann. Instanzen, die mit AS Code manipuliert werden sollen, brauchen zwingend einen solchen Instanznamen.

Instanzen mit Code
Anstatt Instanzen durch drag&drop zu erstellen, kann man auch AS-Code benutzen um Instanzen zu erstellen - das ist vor allem dann praktisch, wenn man viele benötigt, oder wenn erst durch das Verhalten des Benutzers festgelegt wird, wie viele Instanzen wann gebraucht werden. Eine Instanz eines in der Bibliothek vorhandenen Symbols (des Typs MovieClip) erstellt man in AS3 so: code format="actionscript" var myClipInstanz1:MovieClip = new MyClip; //Das Symbol muss existieren, ein MovieClip sein, und zum Export freigegeben sein stage.addChild(myClipInstanz1); //erst hier wird die neue Instanz zur Bühne hinzugefügt und angezeigt code ====Erklärung: Damit das funktioniert, muss das Symbol ein MovieClip, und zum Exportieren in ActionScript freigegeben sein, und es muss den Klassennamen //MyClip// haben (einzustellen unter Eigenschaften > ActionScript im Kontextmenü des Bibliothekssymbols).==== code format="actionscript" var myClipInstanz2:MovieClip = new MyClip; //Das Symbol muss existieren, ein MovieClip sein, und zum Export freigegeben sein addChild(myClipInstanz2, getNextHighestDepth); //erst hier wird die neue Instanz zur Bühne hinzugefügt und angezeig code Erklärung: Hier passiert nochmal genau dasselbe wie oben, es wird also eine zweite Instanz (=Kopie) des Symbols eingefügt. In der zweiten Zeile gibt es zwei Änderungen: code format="actionscript" var clip1:MovieClip = new MovieClip; //ein neuer, leerer MovieClip addChild(clip1); code Es ist auch möglich, einfach einen leeren MovieClip zu erstellen - diesen wird man allerdings nicht sehen - esseidenn, man weist ihm per Code ein Bild zu, oder man benutzt Code, um etwas darauf zu malen: code format="actionscript" var clip1:MovieClip = new MovieClip; //ein neuer, leerer MovieClip clip1.graphics.lineStyle(3, 0xff0000, 0.5); //definiert die Linienart: 3 Pixel breit, Rot, halb transparent clip1.graphics.lineTo(20,20); //zeichnet eine Linie von der aktuellen Koordinate (Default = 0,0) nach 20,20, auf der Instanz clip1.rotation = 25; //dreht die Indtanz (inkl. der Linie darauf) um 25 Grad im Uhrzeigersinn addChild(clip1); //legt die Instanz auf die Bühne, natürlich kann sie auch danach noch manipuliert werden clip1.x = 100; //ändert die x-Koordinate der Instanz auf 100 ( = Pixel vom linken Rand der Bühne) code Diese Manipulationen von existierenden Instanzen funktionieren übrigens immer gleich, egal ob die Instanz per Code erschaffen, aus der Bibliothek geholt (per Code oder drag & drop), von Hand in der Flash-Oberfläche gezeichnet, oder in Flash importiert wurde. Bei letzteren Methoden muss man ggf. noch dafür sogen, dass die interaktiv erschaffene Instanz auch einen Instanznamen bekommt (Im Eigenschaften-Editor).
 * 1) Das //stage.// vor addChild kann man oft weg lassen, da der Code meistens in der Bühne steht (weglassen heisst soviel wie: //hier//). Man kann auch neue MovieClips in Existierende einfügen, dann muss man den entsprechenden Instanznamen vor addChild angeben.
 * 2) Das //getNextHighestDepth// als zweites Argument von addChild sagt Flash, dass die neue Instanz ganz obenauf zu liegen kommen soll, also vor allen existierenden Objekten. Das passiert automatisch, wenn man diese zweite Angabe weg lässt (s. oben). Will man allerdings eine Instanz in eine tiefere Ebene einfügen (also hinter anderen Objekten), dann kann man hier die entsprechende Tiefe mit eine Zahl angeben.

Beispiel
Nehmen wir an, sie haben von Hand einen Punkt gezeichnet und ihn dann in ein Symbol umgewandelt. Dem Symbol könnte man den Namen //Punkt// geben, so wird es in der Bibliothek erscheinen. Wenn sie das Symbol gerade erst erschaffen haben, dann sollte sich eine Kopie/Instanz von //Punkt// noch immer auf der Bühne befinden. Dieser Instanz können sie nun im Fenster Eigenschaften einen Namen zuweisen, z.B. //punkt1//. Wenn sie jetzt //Punkt// nochmal aus der Bibliothek in die Bühne ziehen, ergibt sich eine zweite Instanz, nennen wir diese //punkt2//. Die üblichsten Eigenschaften der beiden Instanzen können wir jetzt (unabhängig voneinander) mit den Zeichenwerkzeugen oder im Eigenschaftsfenster verändern, oder wir können sie mittels AS Code manipulieren. Schauen wir uns beispielsweise das mit der Positionierung an: jede Instanz merkt sich ihre x- und y-Koordinate, und wird an der entsprechenden Stelle in der Bühne angezeigt. //Hinweis: Achtung, Flash benutzt ein in der Informatik übliches Koordinatensystem, bei dem der Punkt mit der Koordinate 0,0 links oben ist, und nicht, wie aus der Mathematik gewohnt, links unten.// All das ist allerdings noch nicht sonderlich interessant, denn es braucht noch immer den Benutzer (sie), der etwas ändert. Deswegen werden wir uns in diesem Kurs eingehend mit der dritten Möglichkeit beschäftigen: code format="actionscript" punkt1.x = 100; //setzt punkt1 hundert Pixel vom linken Rand entfernt punkt2.x = punkt2.x + 10; //rutscht punkt2 um zehn Pixel nach rechts punkt1.y = punkt2.y; //setzt punkt1 auf dieselbe Höhe wie punkt2 code Nicht immer möchte man den Wert einer Eigenschaft verändern (wie in den Beispielen oben), manche sind sogar schreibgeschützt, man kann sie also nur lesen (z.B. rechte Seite des Gleichheitszeichens), aber nicht überschreiben. code format="actionscript" punkt1.currentFrame; //gibt an, in welchem Frame sich der Abspielkopf (innerhalb von punkt1) gerade befindet punkt2.isPlaying; //gibt an, ob der Abspielkopf sich gerade bewegt (true) oder nicht (false) code Um mit diesen Werten etwas anzufangen, muss man sie in einer Variablen speichern oder direkt verwenden, z.B.: code format="actionscript" var zustandP1:Number = punkt1.currentFrame; //speichert den Wert zur späteren Verwendung in einer Variablen namens zustandP1 //oder if(punkt2.isPlaying == false){ punkt2.play; //startet die Animation in punkt2 nur dann, wenn sie nicht sowieso schon läuft. Natürlich kann man das Starten in dieser Zeile auch vom Zustand eines anderen MovieClips abhängig machen, indem man die Bedingung oben entsprechend ändert. } code Auch das Aufrufen von Methoden einer Instanz geht ganz ähnlich, allerdings braucht es dabei IMMER die Klammern (selbst wenn sie leer bleiben) nach dem Namen der Methode, z.B. code format="actionscript" punkt1.start; //started das Abspielen der Zeitleiste von punkt1 punkt1.stop; //stoppt das Abspielen punkt1.hitTestObject(punkt2); //findet heraus, ob sich punkt1 und punkt2 überschneiden code
 * 1) Wenn sie die Instanz mit der Maus bewegen, ändern sich die im Eigenschaftsfenster angezeigten Koordinaten.
 * 2) Wenn sie den x-Wert im Eigenschaftsfenster erhöhen, bewegt sich die Instanz nach rechts.
 * Auch wenn man per ActionScript Code die Eigenschaft _x verändert, bewegt sich die Instanz, z.B.:

Genauere Informationen
Eine Liste aller Eigenschaften und Methoden der MovieClip-Klasse in der offiziellen Klassendokumentation von Adobe.