Snippets+AS2

toc Snippets bedeutet so viel wie **Code-Schnipsel**. Auf dieser Seite finden sie also Beispiel-Code für oft benötigte Funktionalität, den sie übernehmen und mit leichten Änderungen an ihr Projekt anpassen können. Alles was im Code grau erscheint sind übrigens Kommentare die ihnen helfen sollen zu verstehen, was genau hier vor sich geht. AS3-Versionen der Snippets finden sie auf der Seite Snippets AS3. Weitere AS2-Snippets gibt es hier: flash-creations.com/notes/actionscript_reference.php

Auf Mouse-Ereignisse reagieren, übliche Form
code format="actionscript" //Instanzen mit den Namen einKnopf und einMC müssen gegeben sein einKnopf.onPress = pressHandler; function pressHandler{ einMC._visible != einMC._visible; //schaltet die Sichtbarkeit von einMC an und aus (wird immer ins Gegenteil verkehrt) } code

Drag & Drop von Instanzen
code format="actionscript" //Mit diesem Code bewirkt man, dass die Instanz einMC vom Benutzer per drag&drop beliebig verschoben werden kann einMC.onPress = dragStart; einMC.onRelease = dragStop; function dragStart{ einMC.startDrag; } function dragStop{ einMC.stopDrag; } code

Eine Instanz dort hin setzen, wo die Maus gerade ist
code format="actionscript" einMC._x = _root._xmouse; einMC._y = _root._ymouse; code

Sounds aus der Bibliothek holen und bei Klick auf die Instanz //knopf_mc// abspielen
code format="actionscript" //Vorbereitung: Das Sound-Symbol in der Bibliothek ist exportierbar und hat den Export-Bezeichner "guitar.mp3" knopf_mc.onPress = playSound; function playSound{ var gitarre_snd:Sound = new Sound(this); gitarre_snd.attachSound("guitar.mp3"); gitarre_snd.start; } code

Verhindern, dass Sounds bei mehreren Klicks mehrfach geladen werden
code format="actionscript" //Vorbereitung: Das Sound-Symbol in der Bibliothek ist exportierbar und hat den Export-Bezeichner "guitar.mp3" var gitarre_snd:Sound = new Sound(this); //besser, wenn man das ausserhalb der Funktion und daher nur einmal gitarre_snd.attachSound("guitar.mp3"); knopf_mc.onPress = playSound; //ein Klick auf knopf_mc soll die Funktion playSound aufrufen function playSound{ if (gitarre_snd.position==0 || gitarre_snd.position==gitarre_snd.duration){ gitarre_snd.start; //nur starten, wenn der Sound noch neu ist, oder schon fertig gespielt (s. Bedingung des if) } } code

Auf das Ende eines Sounds reagieren
code format="actionscript" //Dieses Ereignis kann man nur dann benutzen, wenn gitarre_snd schon existiert und geladen wurde, s. oben gitarre_snd.onSoundComplete = soundComplete; //das Ereignis onSoundComplete soll die Funktion soundComplete aufrufen function soundComplete{ trace("sound completed"); //hierher kommt der Code, der beim Ende des Sounds ausgeführt werden soll } code

Auf Tastatur-Eingaben reagieren, saubere Variante mit explizitem Listener
code format="actionscript" function keyPressHandler { //Reaktion auf einen Tastendruck definieren if (Key.getCode == Key.RIGHT) { //herausfinden, ob eine bestimmte Taste gedrückt wurde trace("Pfeiltaste rechts wurde gedrückt"); //angeben was dann passieren soll }   if (Key.getCode == 32) { trace("Space Taste wurde gedrückt"); //viele Tasten kann man nicht über den Namen, sondern nur über eine Nummer abfragen }   if (Key.getAscii == 97) {  //genau genommen gibt es zwei Arten von Nummern: getCode gilt nur in Flash, getAscii ist international genormt trace("die Taste a wurde gedrückt"); }   updateAfterEvent; //erzwingt sofortiges Update, unabhängig von der Framerate }; _root.onKeyDown = keyPressHandler; //festlegen, welche function ausgeführt werden soll, wenn _root mitbekommt, dass eine Taste gedrückt wurde // mit _root.onKeyUp könnte man stattdessen auf das Loslassen einer Taste reagieren Key.addListener(_root); //hier sagen wir der Tastatur, dass sie die Hauptzeitleiste (_root) benachrichtigen soll, sobald eine Taste gedrückt wurde code __Hinweis:__ Wie sie sehen entspricht die Taste mit der Nummer 32 scheinbar dem Space, die 97 bezeichnet das kleine a. Um die Nummern der anderen Taste herauszubekommen, schauen sie einfach in dieser Liste der Key-Codes nach; bringen sie die Spalten ASCII und CODE nicht durcheinander.

Fokus setzen, damit Tastendrucke registriert werden
Ein Objekt wird nur dann über einen Tastendruck benachrichtigt, wenn es Fokus hat. Für //_root// ist das meist automatisch der Fall, spätestens wenn der Benutzer einmal auf das Flash-Projekt geklickt hat. Falls es doch mal Probleme gibt, hier der Code zur Fokus-Zuweisung: code format="actionscript" Selection.setFocus(_root); code

Eine ganze Zufallszahl generieren, die zwischen zwei anderen Zahlen liegt
code format="actionscript" var minNum:Number = 1; //Beispiel für Untergrenze, könnte eine beliebige Zahl sein var maxNum:Number = 7; //Beispiel für Obergrenze - exklusive, d.h. die höchste mögliche Zufallszahl wäre hier 6 var randomNum:Number = Math.floor(Math.random*(maxNum-minNum))+minNum; code __Hinweis__: Dieser Code ist nicht schwer zu verstehen wenn man weiss, dass der Befehl Math.random eine zufällige Zahl zwischen 0 und (exklisive) 1 erzeugt. Dabei kommen natürlich Kommazahlen heraus, man muss also noch multiplizieren und (ab)runden, damit man am Ende einen ganzzahligen Wert erhält.

Höhe und Breite der Bühne abfragen
code format="actionscript" var breite:Number = Stage.width; //abfragen und in der Variablen breite speichern trace(Stage.height);            //einfach ausgeben code

Alle Objekte eines Typs (z.B. MovieClips) ansprechen
code format="actionscript" for (var i in this) { //dieses this heisst soviel wie hier, wenn dieser Code in der Hauptzeitleiste steht geht es also um die MovieClips in der Bühne if (typeof (this[i]) == "movieclip") { trace("name: " + this[i]._name + ",\t pfad: " + this[i]._target); } } code

Videos in Flash einbetten
Es gibt viele verschiedene Methoden um in Flash mit externen Videodateien umzugehen - das hat damit zu tun dass (a) es viele unterschiedliche Videoformate gibt, (b) Videoformate notwendigerweise komplex sind (Ton, Bild, Qualitäten, Steuerung, ...) und (c) Videodateien dazu tendieren gross zu sein und daher viel Ladezeit in Anspruch nehmen. Eine Übersicht gibt es hier: http://help.adobe.com/de_DE/Flash/10.0_UsingFlash/WSBDABD69F-D146-4e5c-9340-BF717A10426C.html Wer lange und grosse Videos einbauen will, muss sich mit den Möglichkeiten (Streaming, Pfade, Formate, URLs, ...) intensiver auseinander setzen. Hier eine knappe Anleitung zum Umgang mit KLEINEN/KURZEN Videos (< 2 oder 3 MB): > Wählen sie „FLV in SWF einbetten und in Zeitleiste abspielen“ aus. > Klicken sie auf „Weiter“ und wählen sie im nächsten Fenster als Symboltyp "Movie Clip". Wenn sie den Rest bestätigen erscheint ein neuer MovieClip in ihrer Bibliothek (ggf. auch in der Bühne), der das importierte Video enthält (in den Frames seiner Zeitleiste). Mit diesem MovieClip können sie jetzt in der üblichen Art umgehen, z.B. mit Steuerungsbefehlen wie stop; play; gotoAndPlay; gotoAndStop; ....
 * 1) Das einzubauende Video muss auf ihrer Festplatte gespeichert sein, also ggf. herunterladen.
 * 2) Das Video muss im Format .flv (oder .f4v) vorliegen und sollte nach Möglichkeit schon die Grösse (in Pixel) haben, mit der sie es innerhalb von Flash verwenden wollen - also ggf. mit entsprechender Software konvertieren und verkleinern.
 * 3) Wählen sie „Datei“ > „Importieren“ > „Video importieren“, um den Videoclip in das aktuelle Flash-Dokument zu importieren.
 * 4) Wählen sie auf dem lokalen Computer den Videoclip aus, den Sie importieren möchten.

Zufällige Farbe wählen
code format="actionscript" var color:Number = Math.random*0xffffff; //0xffffff ist kurz für 16 hoch sechs (oder 2 hoch 24) code code format="actionscript" //32bit - jeder Farbkanal hat einen Wert zwischen 0 und 255 (oder 0x00 und 0xff) var a:Number = 255; //Transparenz, dieser Kanal ist meist optional var red:Number = Math.random*255; //die Menge an rot ist zufällig var green:Number = 0; var blue:Number = 0; var color:Number = a << 24 | red << 16 | green << 8 | blue; //den bitshift-Operator << muss man nicht verstehen code
 * Komplett zufällige Farbe
 * Separate Farbkanäle, wenn man bspw. nur die Menge an rot variieren will

Neuen MovieClip erstellen und ein Rechteck darauf zeichnen
code format="actionscript" createEmptyMovieClip("figur",this.getNextHighestDepth); //neuen MovieClip erstellen und also obersten einfügen figur.lineStyle(2, Math.random*0xffffff, 100); //Linienbreite, Farbe, Alpha (0 bis 100) figur.beginFill(Math.random*0xffffff, 70); //Farbe, Alpha figur.moveTo(10, 10); //bewegen ohne zeichnen figur.lineTo(110, 10); //Linie zeichnen figur.lineTo(110, 110); figur.lineTo(10, 110); figur.lineTo(10, 10); figur.endFill; //mit Farbe füllen code

MovieClip-Instanzen mit Code einfügen, duplizieren und entfernen
code format="actionscript" //Aus der Bibliothek holen - der Verknüpfungsname (s. Eigenschaften) ist myClip attachMovie("myClip","clip1",getNextHighestDepth); //das zweite Argument gibt den Instanznamen an clip1._x = 125; //ab jetzt kann ich den neuen Clip über seinen Instanznamen ansprechen/beeinflussen //bestehende Instanze duplizieren geht ganz ähnlich clip1.duplicateMovieClip("kopieVonClip1",getNextHighestDepth); kopieVonClip1._y += 100; //.... //Instanzen entfernen/löschen ist noch einfacher kopieVonClip1.removeMovieClip; code

Eine Instanz mit beliebiger Drehung geradeaus bewegen
code format="actionscript" function moveClip(mc:MovieClip, distance:Number):Void{ var rad:Number = mc._rotation * Math.PI / 180;    //Grad in Radians umwandeln mc._x = mc._x + Math.cos(rad)*distance;        //in x-Richtung verschieben mc._y = mc._y + Math.sin(rad)*distance;        //in y-Richtung verschieben } myClip._rotation = 60; //setzt die Drehung der Instanz myClip auf 60 Grad (0 Grad = rechts, dann im Uhrzeigersinn) moveClip(myClip, 77); //bewegt die Instanz myClip 77 Pixel geradeaus code

Herausfinden, ob sich zwei Instanzen überschneiden
code format="actionscript" //Methode 1; tested ob sich die umhüllenden Rechtecke der beiden Clips überlappen var overlap:Boolean = clip1.hitTest(clip2); //Methode 2; tested ob sich ein bestimmter Punkt im umhüllenden Rechteck von clip1 befindet var overlap:Boolean = clip1.hitTest(130, 34, false); //die ersten beiden Argumente sind die x- und die y-Koordinate des Punktes, das dritte Argument (optional) gibt an, ob es um die genaue Form geht oder nicht (s. Methode 3) //Methode 3; tested ob sich ein bestimmter Punkt innerhalb der Grafik/Form von clip1 befindet var overlap:Boolean = clip1.hitTest(130, 34, true);  //jetzt mit der genauen Form, nicht dem umhüllenden Rechteck //Beispiel: Hier wird Methode drei verwendet um herauszufinden, ob sich die rechte untere Ecke von clip 2 mit der Form (genau) von clip 1 überlappt var overlap:Boolean = clip1.hitTest(clip2._x + clip2._width, clip2._y + clip2._height, true); code