![]() |
Letzte Änderung: 24 Dezember, 2011
|
|
![]() |

Dieses Werk oder Inhalt ist unter einer Creative Commons-Lizenz lizenziert.

Hier gibt es viele Flash Actionscript 3 Beispiele und Tutorials.
Mein besonderer Dank gilt Michael Morawitz von www.bitmagie.de, der in vielen Stunden mein Wissen in Sachen Programmierung erweitert hat.
Diese Page wird mit der Erweiterung meines Wissenstandes erweitert. Auch auf der AS2 Seite befinden sich Links zu den entsprechenden AS3 Themen, sofern sie vorhanden sind.
Ich empfehle die Livedocs von Adobe zum Studium. Diese Seite dient vorab nur als Ergänzung mit vielen einfachen Beispielen zu den Referenzen und dem Programmierhandbuch von Adobe.
Ich arbeite als freischaffender Webdesigner, denken Sie an mich, wenn ein Auftrag zu vergeben ist. Tel: 0231 20 24 93 mail@pastorpixel.de
Eine weitere Einstiegshilfe sind die Videoworkshops von Adobe. Wähle dort das Programm Flash und das Thema Actionscript 3.
Unter Datei / Einstellungen für Veröffentlichung, Karteireiter Flash, definiert man die Programmiersprache AS1, AS2, AS3
In Actionscript 3 ist alles ein bischen strenger. In Actionscript 3 wurden einige wesentliche Dinge geändert. Hier ist in erster Linie das Eventhandling und die Display Liste zu nennen. Vieles, was man von Actionscript 1 und 2 kennt, gibt es nicht mehr, vieles ist hinzugekommen, aber vieles ist auch nicht viel anders als in AS2. Einer der Vorteile von Actionscript 3 ist eine erhöhte Ausführungsgeschwindigkeit. Ein weiterer Vorteil, den vor allen Dingen erfahrene Programmierer zu schätzen wissen, ist der ECMA Standard. Außerdem lassen sich komplexe Projekte durch die Objektorientierung einfacher in den Griff bekommen.
Wenn man Anfänger ist, sollte man vielleicht gleich mit Actionscript 3 anfangen. Es kommt aber auch drauf an, was man vorhat, wenn man in erster Linie als Grafiker arbeitet und nur ein paar Aktionen für Menüs oder die Zeitleiste programmieren will, ist man mit AS1 und AS2 vielleicht besser bedient, aber das muss jeder selbst entscheiden.
Den Umsteigern empfehle ich, sich zuerst mit der objetkorientierten Programmierung zu beschäftigen. Das Thema Klassen oder die objektorientierte Programmierung. OOP sollte an erster Stelle stehen, vor allen Dingen dann, wenn man es in AS2 noch nicht benutzt hat. Das große Problem, dass ich und viele Umsteiger haben ist, dass man die Dinge nicht mehr so programmiert wie in AS2. Das Eventhandling und auch die Displayliste erfordert ein völlig anderes Herangehen an die Sache, man muss umdenken und sollte nicht versuchen, die Dinge genauso zu programmieren wie in AS2.
Hat man das OOP Thema, die EventListener und die Display Liste verstanden, ist alles andere nicht mehr so schwierig. Man könnte sogar sagen, es ist einiges einfacher, aber vor allen Dingen übersichtlicher geworden.
Einige Neuerungen in Actionscript 3
Für alle Neulinge, die noch keine Erfahrung mit Actionscript 2 haben, folgendes. Es gibt in der Flash IDE (dem Flashprogramm) 2 Möglichkeiten Actionscript 3 Code einzufügen:
Sofern es sich nicht um Zeitleistenbefehle wie beispielsweise stop() und play() handelt, sollte man den Code möglichst nicht in irgendwelchen Schlüsselbildern, die im gesamten Flashfilm verteilt sind, unterbringen. Denn bei komplexeren Projekten hat man später kaum eine Chance da durchzublicken. Stattdessen sollte man den Code möglichst nur im ersten Bild der Zeitleiste unterbringen und damit dann Instanzen ansprechen und steuern. Instanzen können beispielsweise Movieclips oder Buttons sein, die man auf die Bühne gezogen hat und denen man einen Instanznamen im Eigenschaftenfenster zugewiesen hat. Eine Alternative zu dieser Vorgehensweise im ersten Schlüsselbild ist die Dokumentklassen, später mehr dazu. Außerdem kann man eigene Klassen bilden, so hat man beispielsweise die Möglichkeit die vorhandenen Methoden und Eigenschaften eines Movieclips zu erweitern. Man stelle sich vor man erstellt sich einen Movieclip "Auto" und erstellt in der Klassendatei Methoden wie fahren(), stoppen() oder Eigenschaften wie speed und farbe. Eine Instanz von "Auto" kann dann mit diesen Methoden und Eigenschaften versehen werden. Später mehr dazu.
Klassenbibliotheken oder Frameworks können aus mehreren Klassendateien mit Endung as bestehen. Um einen Ordner oder eine Ordnerstruktur mit diesen Dateien einzubinden gehe auf:
Bearbeiten, Voreinstellungen, (Kategorie:) Actionscript, (Actionscript3 Einstellungen:)
Quellpfad / Ordner mit Actionscript Klassendateien
Bibliothekspfad / SWC Dateien oder Ordner mit SWC Dateien
Pfad einer externen Bibliothek: SWC Dateien die als Runtime Shared Library verwendet werden
Im Actionscript Code muss man je nach Ordnerstruktur mit einer Import Anweisung auf den entsprechenden Unterordner oder die Klassendatei verweisen.
import com.google.maps.LatLng;
Hiermt verweist man auf einen Unterordner com / google / maps / LatLng
Diese Ordnerstruktur befindet sich in einem Ordner, der auf die oben beschriebene Weise eingebunden wurde.
Wichtig ist hierbei, dass es keine Konflikte durch gleichlautende Namen gibt.
Ein Beispiel
Eine Klassendatei MyClass.as liegt im Ordner
C:/FlashProjekte/pastorpixel/de/pastorpixel/basic
Die Klasse MyClass.as beginnt folgendermaßen:
package de.pastorpixel.basic
Man kann in der fla Datei auf 2 Arten auf den Pfad verweisen:
Dort gibt man folgenden Pfad ein oder wählt diesen über das Ordnersymbol aus
C:\FlashProjekte\pastorpixel
Im ersten Frame der fla oder in der Klassendatei wird auf die Klasse MyClass.as verwiesen:
import de.pastorpixel.basic.MyClass;
Komponenten werden in der Regel über den "Extension Manager" eingebunden. Das ist ein Programm, mit dem man auch für andere Adobe Programme Erweiterungen hinzufügt und verwaltet.
Eine SWC Datei als Komponente hinzufügen
Man kann Dateien auch in den entsprechenden Komponenten Ordner kopieren:
CS3
C:Program FilesAdobeAdobe Flash CS3 languageConfiguration Components
CS4
C:Program FilesAdobeAdobe Flash CS4 Common Configuration Components
CS5
C:Program FilesAdobeAdobe Flash CS5 Common Configuration Components
Man sollte sich dort einen entsprechenden Unterordner anlegen.
Jede von Ihnen deklarierte Variable, jede von Ihnen geschriebene Funktion und jede von Ihnen erstellte Klasseninstanz ist ein Objekt. Man kann sich ein ActionScript 3.0-Programm als eine Gruppe von Objekten vorstellen, die Aufgaben ausführen, auf Ereignisse reagieren und miteinander kommunizieren.
In ActionScript 3.0 wird jedes Objekt durch eine Klasse definiert. Eine Klasse kann man sich als Vorlage oder Entwurf für den Typ eines Objekts vorstellen. Jeder der ein bischen mit Flash gearbeitet hat, kennt das Prinzip schon. Der Movieclip (in der Bibliothek) ist die Klasse, die Instanz auf der Bühne ist das Objekt, welches Eigenschaften (z.B.: xPosition) und Methoden besitzt ( z.B.: gotoAndStop(2));
Bei der objektorientierten Programmierung in ActionScript weist jede Klasse drei Merkmale auf:
Auch das kennt man schon, so besitzt ein Movieclip unter anderem die Eigenschaft xPosition, die Methode play() und das Ereignis EnterFrame.
Eine Klasseninstanz erstellen Sie mit dem Operator new. z.B.:
var myBirthday:Date = new Date();
Klassen definieren siehe Livedocs
weiterführende Themen bei Adobe
weiterführende Themen hier, Display Objects/ MovieClips
package mypackage {
} |
Es gibt verschiedene Arten Klassenbibliotheken einzubinden.
Gehe auf Datei / Einstellungen für Veröffentlichung, dann auf Flash, Scripts, Einstellungen, wähle Karteireiter "Quellpfad" um einen Ordner mit Klassendateien einzubinden, oder "Bibliothekspfad" um eine swc Datei einzubinden. Das ist eine Datei, die alle Klassendateien beiinhaltet.
Es macht Sinn sich alle wichtigen Klassendateien, die man öfter benutzt (beispielsweise papervision) in einen Ordner zu packen, der alle wichtigen Klassen enthält.
Klicke auf Bearbeiten, Voreinstellungen, Actionscript, Actionscript3 Einstellungen und gebe unter "Quellpfad" den neuen Pfad zu diesen as Klassendateien an.
Mit Flash eine Url aufrufen. Hier gibt es mehrere Möglichkeiten. Man kann einen Link direkt einer Textstelle zuweisen oder auch einen Html Text erstellen, wo man per HTML Code einen Link einbettet. Siehe dazu meinen Tipp Text.
Eine weitere Möglichkeit wäre einen Link über einen Button aufzurufen. Dazu muss man erst einen Button erstellen. Siehe dazu meine Basic Tipps und / oder meinen Video Tipp Symbole und Instanzen
Hat man die Instanz eines Buttons aus der Bibliothek auf die Bühne geschoben, wählt man diese aus und vergibt ihr einen Instanznamen im Eigenschaftenfenster, damit man die Instanz dann mit Actionscript ansprechen kann. In diesem Beispiel ist es der Name url_btn.
Hier die Actions.
function goToPastor(event:MouseEvent):void {
navigateToURL(new URLRequest("http://www.pastorpixel.de/"),"_top");
}
url_btn.addEventListener(MouseEvent.CLICK, goToPastor);
number Fließkommazahl
int positive und negative Ganzahlen
uint positive Ganzzahlen
In Actionscript 1 und 2 gab es für numerische Wert nur number, welches eine Fließkommzahl definierte. In Actionscript 3 kommt int für ganzzahlige Werte ohne Komma und uint für positive ganzzahlige Werte hinzu.
Deklaration
var meineVar:String;
Initialisierung
meine Var="der Text";
Deklaration und Initialisierung
var meineVar:String = "ein Text";
Kurzform für mehrere Variablen
Variablen, die sinngemäß zusammengehören, kann man auch folgendermaßen deklarieren:
var weite:Number, hoehe:Number;
Die Variablen werden mit Komma getrennt, Schlüsselwort var ist Pflicht
Auch eine Wertzuweisung ist möglich:
var weite:Number=20, hoehe:Number=39;
Variablen werden mit dem Schlüsselwort var deklariert. Die strikte Typisierung verlangt einen Datentyp. Wenn man noch keinen Wert bei der Deklaration zuweist wird der entsprechende Standardwert zugewiesen (siehe unten). In AS2 herrschte eine lose Typisierung, das heißt der Datentyp konnte sich ändern. Die strikte Typisierung hat den Vorteil einen erhöhten Verarbeitungsgeschwindigkeit, denn bei der Deklaration einer Variablen wird ihr ein bestimmter Speicherplatz zugewiesen, der je nach Datentyp unterschiedlich groß ausfällt.
Auch in for-Schleifen einfach i=1 als Startwert angeben, ist nicht. Auch hier wird eine Variable mit dem Schlüsselwort var deklariert und der Datentyp angegeben.
for (var i:int=1; i<10; i++) {
outputText.appendText(i.toString()+"\n");
}
Dynamische Textfelder zeigen keine number Datentypen mehr an. Sie müssen vorher in Strings umgewandelt werden. Das kann man mit der Funktion toString() machen.
Neu hinzugekommen ist hier auch die Funktion appendText(), welche einen String an den vorhandenen String anhängt. In Actionscript 1 hätte man die gleiche Funktion so schreiben können.
for (i=1;i<8;i++) {
outputText.text+=i+"\n";
}
Hier noch eine andere Möglichkeit in AS3. Man sieht der + Operator verknüpft auch in AS3 Stings mit Number Datentypen. Heraus kommt ein String. Außerdem ist das + Zeichen der Plusoperator bei Zahlenwerten.
var meinText:String="";
for (var i:int=1; i<10; i++) {
meinText+=i+"\n";
} outputText.text=meinText;
Beim Deklarieren einer Variablen mit strikter Typisierung muss der Datentyp zugewiesen werden.
Man kann Variablennamen suffixe anhängen, um Codehinweise zu erhalten:
Codehinweise Hilfe Adobe Manchmal werden die Codehinweise trotz korrekter Einstellunge nicht angezeigt, in diesem flashforum.de Beitrag wird eine Lösung vorgestellt. Danke user "tchero". Ich zitiere:
"...Flash prüft bei den Codehinweisen den kompletten Ordnerinhalt. Es bindet also auch automatisch selbsterstellte AS3 Klassen in dem selben Ordner mit ein. Es sollten sich also nicht zu viele andere Verzeichnisse oder Dateien in dem Verzeichnis befinden."
Also, Datei in einem leeren Ordner abspeichern und eventuell auch Verweise auf selbst erstellte Klassen entfernen. Siehe OOP
Jeder Datentyp hat eine Klasse. Die Klassen findet man im Actionfenster unter: Oberste Ebene. Hier sieht man die Eigenschaften und Methoden der Klassen, die Änderungen ermöglichen. Nach Datentyp überprüfen Mit dem is Operator kann man nicht nur den Datentyp überprüfen sondern auch ob der Datentyp eine Schnittstelle implementiert (Vererbung). var myMc:MovieClip = new MovieClip(); Siehe Adobe Programmierhandbuch S.98. Strikter Modus |
Codehinweise erweitern Datentyp feststellen Wenn man abfragen will, ob eine Instanz einem bestimmten Datentyp zugehört: if(myMovie is MovieClip){ Standardwerte Bei Datentypen außer "Boolean", "Number", "int" und "uint" lautet der Standardwert einer nicht initialisierten Variablen null.
Für Variable des Typs Number gibt es eine besondere Funktion auf oberster Ebene namens isNaN(), die den booleschen Wert true zurückgibt, wenn die Variable keine Zahl ist, andernfalls gibt sie false zurück. Damit kann man somit auch überprüfen, ob eine Number-Variable initialisiert wurde.
Typumwandlung siehe Adobe Hilfe |
Zum Thema Funktionen siehe AS2 Tipps. Die Unterschiede zu AS3 werden im folgenden erklärt.
In AS3 bei strikter Typisierung, wird den Parametern der Datentyp zugewiesen:
function meineFunktion(para1:Number, para2:String){
Anweisungen;
}
Sofern die Funktion mittels return Rückgabewerte liefert, wird der Datentyp des Rückgabewertes hinter die runde Klammer gesetzt.
function meineFunktion ():Number{
Anweisung;
return numerischerWert;
}
void bedeutet, dass hier kein Rückgabewert geliefert wird, ansonsten wird der Datentyp des Rückgabewertes angegeben.
function meineFunktion ():void{
Anweisung;
}
Im folgenden Beispiel gibt die Funktion ein Textfeld Instanz zurück:
import flash.text.TextField;
var myTf:TextField = createCustomTextField(0,50,200,20);
myTf.text = "Hier wird etwas Text hinzugefügt";
function createCustomTextField (x:Number, y:Number, width:Number, height:Number):TextField
{
var result:TextField = new TextField();
result.x = x;
result.y = y;
result.width = width;
result.height = height;
addChild (result);
return result;
}
Variablen, die in einer Funktion deklariert wurden haben nur innerhalb der Funktion Gültigkeit. Variablen, die außerhalb einer Funktion deklariert wurden sind global und haben überall Gültigkeit. Der Compiler verschiebt Variablendeklarationen an den Anfang, aber nicht Wertzuweisungen in Variablen.
Wenn man eine globale Variable definiert und innerhalb der Funktion eine Variable gleichen Namens definiert. So existiert die globale Variable innerhalb der Funktion überhaupt nicht. In AS2 war das anders, da wurde die globale Variable erst überschrieben, wenn die lokale Variable erzeugt oder ihr ein Wert zugewiesen wurde. Folgende Beispiele verdeutlichen den Sachverhalt:
| Actionscript | Ausgabe | Erklärung |
|---|---|---|
var a:Number =10; |
10 | Die globale Variable a hat auch innerhalb der Funktion Gültigkeit. |
| function myFunc(){ var a:Number=20; } myFunc(); trace (a); |
die lokale Variable hat außerhalb der Funktion keine Gültigkeit. | |
| var b:Number; function myFunc(){ var a:Number=20; b=a; } myFunc(); trace (b); |
20 | Hier wurde der globalen Variablen b der Wert der lokalen Variablen a zugewiesen. |
var a:Number =10; |
NaN |
Die globale Variable a existiert in der Funktion überhaupt nicht, weil es innerhalb der Funktion eine lokale Variable gleichen Namens gibt. Die erste trace-Anweisung gibt NaN aus (not a number), |
Rekursiv bedeutet etwas ruft sich selbst auf. Hierzu sind zwar normalerweise die Schleifen da, aber es kann auch nützlich sein eine rekursive Funktion zu schreiben.
function meineSchleife(i:Number){
if(i<9){
trace(i);
meineSchleife(++i);
}
}
meineSchleife(1);
Wichitig ist hier die Zeile
meineSchleife(++i);
Wenn die Inkrement Anweisung vor der Variablen steht, gilt sie für die gesamte Anweisung. Sie wird also vor dem erneuten Funktionsaufruf um 1 erhöht.
Siehe hierzu das Thema AS2 / Variablen/ Inkrement Dekrement
Parameter in Funktionen kann man Standardwerte vergeben, allerdings dürfen nach einem Parameter mit Standardwert keine weiteren Parameter ohne Standardwert folgen:
function meineFunc(a:int, b:int=1, c:int=1, d:int=2){
return a+b+c+d;
}
meineFunc(10,10);
Hier kommt 23 raus, denn a=10, b=10, c=1, d=2
Bei c und d wurden die
vordefinierten Standardwerte genommen. Man braucht also Parametern mit Standardwert beim Aufruf der Funktion keinen Wert zuweisen. Diese Parameter müssen logischerweise am Ende stehen, denn woher soll Flash sonst wissen, welchen Parameter man meint.
function meineFunc (a:int=1, b:int, c:int=10){
return a+b+c;
}
So geht das nicht, hier wurde ein Paramter ohne Standardwert nach einem Parameter mit Standardwert gesetzt. Das erzeugt gleich einen Compilerfehler.
Hier ein paar Beispiele mit Funktionen die Zufallswerte und zufällige Punkte innerhalb eines Rasters erzeugen.
Die gängisten Funktionen der Zeitleistensteuerung
stop();
next_btn.addEventListener(MouseEvent.CLICK, goNextFrame);
prev_btn.addEventListener(MouseEvent.CLICK, goPrevFrame);
nextScn_btn.addEventListener(MouseEvent.CLICK, goNextScn);
prevScn_btn.addEventListener(MouseEvent.CLICK, goPrevScn);
start_btn.addEventListener(MouseEvent.CLICK, goStart);
stop3_btn.addEventListener(MouseEvent.CLICK, goStop3);
play3_btn.addEventListener(MouseEvent.CLICK, goPlay3);
function goNextFrame(evt:MouseEvent):void{
nextFrame();
}
function goPrevFrame(evt:MouseEvent):void{
prevFrame();
}
function goNextScene(evt:MouseEvent):void{
nextScene();
}
function goPrevScene(evt:MouseEvent):void{
prevScene();
}
function goStart(evt:MouseEvent):void{
gotoAndStop(1, "Szene 1");
}
function goStop3(evt:MouseEvent):void{
gotoAndStop(3);
}
function goPlay3(evt:MouseEvent):void{
gotoAndPlay(3);
}
Mithilfe der FrameLabel-Klasse von ActionScript 3.0 können Bildbezeichnungen im Code verwendet werden. Siehe die Referenz von Adobe
currentFrame:int Die Nummer des aktuellen Bildes, anders ausgedrückt: das Bild, in dem sich der Abspielknopf gerade befindet.
currentFrameLabel:String Die Bezeichnung des aktuellen Bildes, wenn keine Bezeichnung vorhanden ist, wird Wert null zurückgegeben
currentLabel:String Die Bezeichnung des zuletzt gefundenen Bildes mit Bildbezeichnung, wenn nicht vorhanden wird Wert null zurückgegeben.
totalFrames:int Die Anzahl der Bilder in der Zeitleiste.
currentLabels:Array Ein Array mit allen Bildbezeichnungen. siehe unten
if (robot.currentLabel == "walking" { // Aktion ausführen }
Mit dem folgendem Code wird die Zeitleiste der Movieclipinstanz "girl" gesteuert. Der MC hat im ersten Bild die Bezeichnung "laufen" im letzten Bild die Bezeichnung "stehen". Im vorletzten Bild befindet sich die Aktion gotoAndPlay(1); Im letzten Bild steht das Mädchen in den Bildern davor befindet sich eine Laufschleife.
function stopNgo(event:MouseEvent):void {
if (girl.currentLabel=="stehen") {
girl.gotoAndPlay(1);
anzeige_mc.gotoAndStop(1);
} else {
girl.gotoAndStop("stehen");
anzeige_mc.gotoAndStop(2);
}
}
stopgobut.addEventListener(MouseEvent.MOUSE_UP, stopNgo);
In der stopNgo Funktion wird auch eine Movieclipinstanz anzeige_mc angesprochen, welche im ersten Bild das Stopzeichen und im zweiten Bild das Pfeil Zeichen hat. Da dieser MC über dem Button liegt und damit dieser MC nicht auch auf den Mauscursor reagiert, habe ich folgende Funktion hinzugefügt:
anzeige_mc.mouseEnabled=false;
Außerdem gibt es noch eine Funktion für die Bewegung des Hintergrundes, welcher hier eine MC Instanz namens strasse ist.
function bewegung(event:Event):void {
if (girl.currentLabel=="laufen") {
strasse.x-=10;
}
if (strasse.x<67) {
strasse.x=1488;
}
}
strasse.addEventListener(Event.ENTER_FRAME, bewegung);
Hier noch eine anderes Beispiel, wo die Zeitleiste rückwärts läuft
function timlineBackward(event:Event):void
{
if (bicycle.currentFrame == 1) {
bicycle.gotoAndStop(bicycle.totalFrames);
} else {
bicycle.prevFrame();
}
}
bicycle.addEventListener(Event.ENTER_FRAME, timlineBackward);
currentLabel.name soll die Bildbezeichnung liefern
currentLabel.frame die Bildnummer
currentLabels (Mehrzahl) liefert ein Array mit allen Bildern (Adobe Referenz).
import flash.display.FrameLabel;
var labels:Array = meinMc.currentLabels;
for (var i:uint = 0; i < labels.length; i++) {
var label:FrameLabel = labels[i];
trace("frame " + label.frame + ": " + label.name);
}
Hier geht es darum, zu kontrollieren ob die Zeitleiste läuft oder nicht. Man überprüft also die Zeitleiste. Das mache ich, indem ich mit der Bildlaufrate abfrage ob das jetzige Bild dem vorigen Bild entspricht. Dazu habe ich eine Variable, namens bild, welche den Wert des jetzigen Bildes erst dann bekommt, nachdem man abgefragt hat, ob ihr Wert dem jetzigen Frame entspricht. Zu diesem Thema passt auch dieser Tipp. Dort werden alle Display Objects, die Movieclips sind gestoppt addChild/ alleDisplayObjekte abfragen
Anstatt den Event Handler ENTER_FRAME zu benutzen kann man auch mit setInterval eine Anweisung in Schleife aufrufen. Die Parameter sind, die Funktion und die Zeitverzögerung in Millisekunden. Außerdem kann man danach noch weitere Parameter übergeben.
function keepOnTurning():void {
planet.rotation+=4;
}
var intervalV:uint = setInterval(keepOnTurning, 50);
Adobe Beispiel
function SetIntervalExample() {
var intervalId:uint = setInterval(myRepeatingFunction, intervalDuration, "Hello", "World");
}
function myRepeatingFunction():void {
trace(arguments[0] + " " + arguments[1]);
}
Mit folgendem Befehl kann man die Framefrate fps (Bild pro Sekunde) per AS3 ändern.
this.stage.frameRate = 14;
So hat man die Möglichkeit einen Film schneller oder langsamer ablaufen zu lassen. Siehe dazu das Beispiel im nächsten Tipp.
Die Zeitleiste rückwärts laufen zu lassen ist einfach, man ruft onEnterFrame das vorige Bild auf.
stage.addEventListener(Event.ENTER_FRAME, goPrevFrame);
function goPrevFrame(evt:Event):void {
gotoAndStop(currentFrame-1);
}
Wie kann man jedoch alle Zeitleisten rückwärts laufen lassen, also auch die Zeitleisten von MC Instanzen?
Hat man weitere MC-Instanzen eingefügt, die eigene Zeitleisten haben, hat man das Problem, dass diese Zeitleisten von hinten starten müssen. Abhilfe schafft man folgendermaßen. Man erstellt ein Symbol "Grafik" und fügt dort eine Animation ein. Man wählt die Instanz dieser Grafik auf der Bühne aus und wählt im Eigenschaftenfenster unter "Schleife" die Option "einmal abspielen" oder auch "Schleife", wenn die Zeitleiste mehrmals abspielen soll. In CS3 oder tiefer, stellt man diese Option direkt beim Erstellen der Grafik ein, oder man wählt das Kontextmenü der Grafik in der Bibliothek und stellt unter Eigenschaften die Option ein.
Im folgenden Beispiel ist die Pflanze eine "Grafik" mit Zeitleiste wie oben beschrieben. Auch die Blüten der Pflanze sind Instanzen von Gafiken mit eigener Zeitleiste für das Wachstum. Außerdem wird am Ende die Pflanze im Hauptfilm mittels Tweening unsichtbar gemacht. Das Tweening befindet sich im Hauptfilm.
this.fast_btn.addEventListener(MouseEvent.MOUSE_DOWN, fastFps);
this.fast_btn.addEventListener(MouseEvent.MOUSE_UP, slowFps);
this.back_btn.addEventListener(MouseEvent.MOUSE_DOWN, startBack);
this.back_btn.addEventListener(MouseEvent.MOUSE_UP, stopBack);
function fastFps(evt:MouseEvent):void {
this.stage.frameRate = 160;
}
function slowFps(evt:MouseEvent):void {
this.stage.frameRate = 14;
}
function startBack(evt:MouseEvent):void {
stage.frameRate = 16;
stage.addEventListener(Event.ENTER_FRAME, goPrevFrame);
}
function stopBack(evt:MouseEvent):void {
this.stage.frameRate = 14;
stage.removeEventListener(Event.ENTER_FRAME, goPrevFrame);
this.play();
}
function goPrevFrame(evt:Event):void {
gotoAndStop(currentFrame-1);
}
//--------------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME, bildanzeige);
function bildanzeige(evt:Event):void {
this.bild.text=String(currentFrame);
}
Hier ein Verweis auf eine gut gemachte Anleitung, bei der man auf schnelle Art und Weise eine Tweening Animation als Actionscript kopiert und anderen Movieclip Instanzen zuweist: http://active.tutsplus.com/tutorials/animation/quick-tip-copying-timeline-animation-into-a-class/
Man kann ein Tweening erstellen (siehe Grundlagen) und dieses als Actionscript exportieren, indem man die Frames in der Zeitleiste auswählt und dann mit rechter Maustaste "Actionscript 3 kopieren" wählt. Es gibt auch andere Möglichkeiten. Das kopierte Actionscript kann man in ein Schlüsselbild einfügen. Am Ende des Codes gibt es eine kommentierte Zeile, in die man den Instanznamen der zu bewegeneden Movieclipinstanz einträgt und die Zeile auskommentiert.
__animFactory_rect_mc.addTarget (mein_mc, 0);
Fügt man den Code nicht in ein Schlüsselbild sondern in die Dokumentenklasse ein ist es notwendig die beiden Variablen vom Typ MotionBase und AnimationFactor als protected Variable der Klasse zu definieren.
package
{
import fl.motion.AnimatorFactory;
import fl.motion.Animator;
import fl.motion.AnimatorBase;
import fl.motion.MotionBase;
import fl.motion.Motion;
import flash.filters.*;
import flash.geom.Point;
import flash.display.MovieClip;
public class Animat extends MovieClip
{
protected var __motion_rect_mc:MotionBase;
protected var __animFactory_rect_mc:AnimatorFactory;
public function Animat ()
{
if (__motion_rect_mc == null)
{
__motion_rect_mc = new Motion();
__motion_rect_mc.duration = 24;
// Call overrideTargetTransform to prevent the scale, skew,
// or rotation values from being made relative to the target
// object's original transform.
// __motion_rect_mc.overrideTargetTransform();
// The following calls to addPropertyArray assign data values
// for each tweened property. There is one value in the Array
// for every frame in the tween, or fewer if the last value
// remains the same for the rest of the frames.
__motion_rect_mc.addPropertyArray ("x", [0,-16.7686,3.38726,53.2696]);
__motion_rect_mc.addPropertyArray ("y", [0,53.7445,104.684,130.691]);
__motion_rect_mc.addPropertyArray ("scaleX", [1.000000]);
__motion_rect_mc.addPropertyArray ("scaleY", [1.000000]);
__motion_rect_mc.addPropertyArray ("skewX", [0]);
__motion_rect_mc.addPropertyArray ("skewY", [0]);
__motion_rect_mc.addPropertyArray ("rotationConcat", [0]);
__motion_rect_mc.addPropertyArray ("blendMode", ["normal"]);
__motion_rect_mc.addPropertyArray ("cacheAsBitmap", [false]);
// Create an AnimatorFactory instance, which will manage;
// targets for its corresponding Motion.
__animFactory_rect_mc = new AnimatorFactory(__motion_rect_mc);
__animFactory_rect_mc.transformationPoint = new Point(0.500000,0.500000);
// Call the addTarget function on the AnimatorFactory
// instance to target a DisplayObject with this Motion.
// The second parameter is the number of times the animation
// will play - the default value of 0 means it will loop.
__animFactory_rect_mc.addTarget (rect_mc, 0);
}
}
}
}
Näheres zu Symbolen siehe meine AS2 Tipps.
Es gibt 3 Arten eine Instanz eines Movieclips zu erzeugen:
Die Eigenschaften der Movieclips haben in Actionscript 3 andere Bezeichnungen. Es fällt auf, dass der Unterstrich verschwunden ist. Eine Auflistung der Eigenschaften findet man im Actionbedienfeld unter flash.display / Movieclip / Eigenschaften (properties) Oder im Actionscript 3 Komponenten Referenzhandbuch. Im nächsten Tipp wird erklärt, wie man Movieclips dynamisch erzeugt. Die EventHandler von AS2 gibt es nicht mehr.
Einige Eigenschaften sind neu hinzugekommen:
Den bei Buttons üblichen Handcursor auch in Movieclips an
zeigen
my_mc.buttonMode = true;
my_mc.useHandCursor = true;
Wenn man beispielsweise eine Movieclipinstanz als Cursor einsetzen will (siehe dragMovieclip oder Mausposition), kann es von Vorteil sein, dass er nicht mehr auf MouseEvents reagiert, damit darunterliegende Displayobjekte oder Buttons anklickbar sind. Die Deaktivierung erfolgt folgendermaßen:
my_mc.mouseEnabled = false;
Man sollte auch darauf achten, dass Kindelemente innerhalb des Mc auch entsprechend mouseEnabled werden.
Wie die Füllmethoden in Photoshop so ist es auch mit Flash möglich Movieclips Füllmethoden zuzuweisen. Es gibt 2 Möglichkeiten a) händisch über die Einstellungen "mischen" im Einstellungsfenster oder über Actionscript:
myDisplayObject.blendMode = BlendMode.LIGHTEN;
fogende Konstanten sind möglich:
ADD
public static const ADD:String = "add"
ALPHA
public static const ALPHA:String = "alpha"
DARKEN
public public static const DARKEN:String = "darken"
DIFFERENCE
public static const DIFFERENCE:String = "difference"
ERASE
public static const ERASE:String = "erase"
HARDLIGHT
public static const HARDLIGHT:String = "hardlight"
INVERT
public public static const INVERT:String = "invert"
LAYER
public public static const LAYER:String = "layer"
LIGHTEN
public public static const LIGHTEN:String = "lighten"
MULTIPLY
public public static const MULTIPLY:String = "multiply"
NORMAL
public public static const NORMAL:String = "normal"
OVERLAY
public public static const OVERLAY:String = "overlay"
SCREEN
public public static const SCREEN:String = "screen"
SUBTRACT
public public static const SUBTRACT:String = "subtract"
Den AS2 Befehl attachMovieClip() gibt es nicht mehr. In Actionscript 3 werden Instanzen aus der Bibliothek mit addChild() auf die Bühne gebracht. Der Befehl duplicate Movieclip wurde in AS3 ersatzlos gestrichen. In AS3 ist es möglich alle Instanzen anzusprechen, auch die die man in der IDE eingefügt hat. Selbst dann, wenn man keinen Instanznamen vergeben hat.
Das Thema bei Adobe Programmieren mit Anzeigobjekten http://livedocs.adobe.com/flash/9.0_de/main/00000141.html
Eine Sache hat mir beim Umstieg von AS2 zu AS3 Schwierigkeiten bereitet und zwar die Referenzierung oder das Ansprechen von Movieclips oder anderen Instanzen, die ineinander verschachtelt sind. Wenn ich im ersten Frame per Actionscript Instanzen erzeuge und diese mit addChild() innerhalb einer anderen Instanz einfüge, so kann ich in AS3 diese Instanz trotzdem einfach über den Instanznamen ansprechen, ohne den Pfad aufzuführen.
var mc:MovieClip = new MovieClip();
addChild(mc);
var tf:TextField = new TextField();
mc.addChild(tf);
tf.appendText("bla bla");
folgendes ist falsch, obwohl sich tf innerhalb von mc befindet
mc.tf.appendText("bla bla");
Anders verhält es sich, wenn das Textfeld händisch in dem Movieclip eingefügt wurde. Nehmen wir an, es hätte auch den Instanznamen tf im Eigenschafteninspektor zugewiesen bekommen und die Instanz des Movieclips hat wieder den Instanznamen mc. In dem Fall müsste ich das Textfeld folgendermaßen ansprechen.
mc.tf.appendText("bla bla");
In beiden Fällen ist es völlig egal ob der mc händisch auf die Bühne gezogen wurde oder ob es sich um eine Movieclipklasse handelt, die per Actionscript instanziiert wurde.
Bewege die Maus über die MovieClip Instanzen (Kreise);
Um einen DisplayObjekt Container nach vorne zu bringen, kann man ihn einfach mit addChild() wieder hinzufügen. Alternativ kann man den Z-Index aber auch über seChildIndex() definieren. Das Thema in den Adobe Referenzen
ADDED_TO_STAGE (AS3 Referenzen)
Wenn man eine Movieclip- Klasse oder ein andere Display Objekt Klasse hat und möchte in dieser Klasse einen Event Listener auf die stage registrieren, so ist das erst dann möglich, wenn die Bühne bekannt ist. Das ist der Fall, wenn das Objekt an die Displayliste angehängt wurde. addChild()
REMOVED_FROM_STAGE (AS3 Referenzen)
Wenn man ein DisplayObject aus der Displayliste entfernt, werden nicht automatisch alle Events entfernt, die eventuell in der Klasse enthalten sind, das kann zu Fehlern führen und außerdem belastet es den Speicher, besonders bei onEnterFrame Ereignissen. Abhilfe schafft hier removedFromStage. Damit kann man alle enthaltenen Events löschen, sobald die Instanz aus der Displayliste entfernt wird.
package {
import flash.display.MovieClip;
import flash.events.*;
public class MyMc extends MovieClip {
//----------------------------------------------
public function MyMc() {
super();
if (stage) {
init();
} else {
addEventListener(Event.ADDED_TO_STAGE,init);
}
}
//-----------------------------------------------
private function init(e:Event=null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
addEventListener(Event.REMOVED_FROM_STAGE, destroy);
stage.addEventListener(MouseEvent.MOUSE_UP, getMouseX);
}
//-----------------------------------------------
function getMouseX(evt:MouseEvent):void {
trace("X-Mouse ist: "+mouseX);
}
//-----------------------------------------------
private function destroy(e:Event):void {
removeEventListener(Event.REMOVED_FROM_STAGE, destroy);
stage.removeEventListener(MouseEvent.MOUSE_UP, getMouseX);
}
}
}
Wenn ein neues Child Display Object einem Display Object Container hinzugefügt wird, versendet Actionscript einen Event Event.ADDED der auf das Child Display Object verweist. Genauso wird eine Event Event.REMOVED verschickt, wenn ein Display Object von einem Display Object Container entfernt wird.
Mit Event.ADDED kann man jedoch nicht überprüfen, ob ein Object der Display Liste hinzugefügt wurde, da er nur erscheint, wenn ein Object einem DisplayObject-Container hinzugefügt wurde. Dieser Container muss aber nicht zwangsläufig der Displayliste hinzugefügt worden sein. Für derlei Überprüfungen nimmt man Event.ADDED_TO_STAGE und Event.REMOVED_FROM_STAGE
Wenn ein Event Dispatch (Versand) auf ein Ziel in der Displaylisten-Hierachie verweist werden alle Abkömmlinge und Eltern benachrichtigt. Daher kann man Event.ADDED und Event.REMOVED auf 2 Arten einsetzen:
var container:Sprite = new Sprite ();
var child:Sprite = new Sprite ();
var grandchild:Sprite = new Sprite();
function addedListener (e:Event):void
{
trace ("ADDED wurde aufgerufen");
trace (e.currentTarget.name);
trace(e.target.name);
}
container.addEventListener(Event.ADDED, addedListener);
stage.addChild(container);
container.addChild(child);
child.addChild(grandchild);
In diesem Beispiel wird die Funktion "addedListener" 3 mal aufgerufen.
An diesen Beispielen kann man auch die Phasen eines Events verdeutlichen und zwar ist der EventListener auf container registriert. Die "container" Instanz wird per addChild hinzugefügt und der Eventflow befindet sich in der Target Phase, während sich der Eventflow bei child und grandchild in der Bubbling Phase befindet.
function addedListener (e:Event):void
{
trace ("ADDED während Phase: "+e.eventPhase);
trace(e.target.name);
}
Es lassen sich somit verschiedene Überprüfungen programmieren.
Das Display Object selbst wird einem Eltern-Container hinzugefügt:
if(e.eventPhase == EventPhase.AT_TARGET)
{
trace("ich wurde selbst hinzugefügt");
}
Dem Display Object wurde ein Display Object hinzugefügt:
if(e.eventPhase == EventPhase.BUBBLING_PHASE)
{
trace("ich habe einen Nachfahren bekommen");
}
Das Display Object ist ein direktes Child:
if(DisplayObject(e.target.parent) == e.currentTarget)
{
trace("Ich habe ein Kind bekommen.");
}
Alle Objekte der Displayliste löscht man am besten mit einer while Schleife
while (this.numChildren>0) {
this.removeChildAt(this.numChildren-1);
}
Alle auf diese Weise gelöschten Objekten befinden sich noch im Speicher und könnten mit addChild() wieder hinzugefügt werden. Man müsste also auch noch alle Variablen die auf das Objekt verweisen auf null setzen, damit der Garbage Collector den Speicher frei machen kann.
und wenn es Movieclips sind, werden sie gestoppt.
function displayListStop(container:DisplayObjectContainer):void {
var child:DisplayObject;
var movie:*;
var clip:MovieClip;
for (var i:uint=0; i < container.numChildren; i++) {
child=container.getChildAt(i);
if (child is MovieClip) {
movie=child;
clip=movie;
clip.stop();
}
if (container.getChildAt(i) is DisplayObjectContainer) {
displayListStop(DisplayObjectContainer(child));
}
}
}
Aufruf der Funktion für die gesamte Bühne. Man achte auf die Syntax: this.stage
displayListStop(this.stage);
4 Beispiele. Diese Beispiele sind eine gute Übung, um sich mit den Klassen vertraut zu machen.
Eine Movieclip, dessen Inhalt nicht mittig im Registrierpunkt liegt, mittig in einen anderen, (leeren) Movieclip platzieren. Siehe auch den Tipp "Programmierte Bewegung mit Richtungswechsel, nach Wandberührung"
Passend zum Thema globalToLocal() und getBounds() siehe auch das Thema Point
var myVar:Number;
back.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
function enterFrameHandler(event:Event):void {
myVar = root.mouseX;
trace(myVar)
}
Im folgenden Beispiel wird die Mausposition relativ zum Mittelpunkt des Movieclips ausgegeben
var myVar:Number;
back.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
function enterFrameHandler(event:Event):void {
myVar = back.mouseX;
trace(myVar)
}
mc.getObjectsUnderPoint(Point):Array
Mit dieser Funktion bekommt man ein Array mit Objekten, die diesem Displayobjekt (mc) untergeordnet sind. Im folgenden Beispiel werden alle Objekte, die unter dem angeklickten Punkt liegen etwas transparenter.
import flash.geom.Point;
addEventListener(MouseEvent.CLICK, alphaTarget);
function alphaTarget(evt:MouseEvent):void
{
var mausPos:Point = new Point(stage.mouseX,stage.mouseY);
var touchedObj:Array = stage.getObjectsUnderPoint(mausPos);
trace(touchedObj);
for (var i:uint=0; i < touchedObj.length; i++)
{
touchedObj[i].alpha -= 0.1;
}
}
In AS3 gibt es hitTestObject(DisplayObject) und hitTestPoint(x, y, Form). Hat eine Kollision stattgefunden liefert die hitTest Funktion den Wert true, andernfalls false. (siehe auch vorigen Tipp alle Objekt unter Punkt)
ersterMc.hitTestObject(zweiterMc);
Im folgenden Beispiel wird überprüft, ob die Mausposition nicht innerhalb des Hintergrunds der Movieclipinstanz "meinMc" liegt . Der dritte Parameter ist ein boolscher Wert. Bei true, wird nur der gefüllte Bereich des MC's herangezogen. Bei false gilt das kleinstmöglichste Rechteck, welches sich um den Inhalt des MC's legt als Überprüfungsbereich.
public function kollision(evt:Event) {
if (! meinMc.hitTestPoint(root.mouseX,root.mouseY,false)) {
meinMc.removeEventListener(Event.ENTER_FRAME, kollision); hideTextfields();
}
}
Event Listener hinzufügen:
meinMc.addEventListener(Event.ENTER_FRAME, kollision);
Verschiebe die Elemente mit gedrückter Maustaste und drehe sie durch Doppelklick.
in den MCs m1_mc und m2_mc befinden sich jeweils die Instanzen k1_mc und k2_mc.
nur wenn beide Kreise die beiden Kreise des anderen MCs berühren, wird m1_mc auf die Position von m2_mc gebracht.
siehe Event Mouse leaves stage Event
Wenn man dropTarget benutzt und ein DragElement über einer leeren Stelle loslässt, erscheint eine Fehlermeldung bezüglich null-Objekt Verweis. Deswegen füge ich noch eine Grafik ein, die sich über den gesamten Hintergrundbereich erstreckt. Eine andere Möglichkeit wäre Droptarget mit einem try catch Block abzufangen:
function mouseReleased(evt:MouseEvent):void
{
evt.currentTarget.stopDrag();
try {
if (evt.currentTarget.dropTarget.parent is Quad) {
myTrace("Instanz von Klasse Quad mit Namen: " + evt.currentTarget.dropTarget.parent.name);
}
} catch (e:Error) {
trace("kein dropTarget Element gefunden.");
}
}
DropTarget liefert immer das Objekt, auf dem das DragElement liegt. In diesem Beispiel möchte ich einen Verweis auf die "Quad" Instanz. "Quad" ist ein Movieclip, welche ich als Quad Klasse definiert habe. In diesem Quad-Movieclip liegt eine quadratische Grafik. Beim Loslassen über so einem Element liefert dropTarget einen Verweis auf eben diese quadratische Grafik. Daher verweise ich mittels parent auf das Elternelement. evt.currentTarget.dropTarget.parent.name
function myTrace(traceValue:String):void
{
anzeige.text=traceValue;
}
var target1:Quad = new Quad();
target1.name="t1";
target1.x=200;
target1.y=100;
var target2:Quad = new Quad();
target2.name="t2";
target2.x=100;
target2.y=200;
var target3:Quad = new Quad();
target3.name="t3";
target3.x=100;
target3.y=100;
addChild(target1);
addChild(target2);
addChild(target3);
target3.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
target1.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
target2.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
target3.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
target1.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
target2.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
function mouseDown(evt:MouseEvent):void
{
evt.currentTarget.parent.addChild(evt.currentTarget);
evt.currentTarget.startDrag();
}
function mouseReleased(evt:MouseEvent):void
{
evt.currentTarget.stopDrag();
if (evt.currentTarget.dropTarget.parent is Quad) {
myTrace("das ist ein Quad mit Namen: " + evt.currentTarget.dropTarget.parent.name);
}
}
siehe auch Drehknopf Slider im Tipp programmierte Bewegung Hier eine Anleitung, wie man sich einen Slider mit startDrag() und stopDrag() mit AS3 erstellt. Es ist nicht ganz so einfach, wie man im ersten Augenblick vielleicht vermutet. Die Lösung habe ich aus diesem Tipp. Danke Der Slider soll mittels startDrag() verschoben werden. Dieses Ziehen soll auch weiter funktionieren, wenn die Maus nicht mehr direkt über dem Slider liegt und erst stoppen, sobald man die Maus loslässt. Würde man die stopDrag() Funktion mit dem Event MOUSE_UP direkt an den Slider hängen, würde es nicht funktionieren, da die Maus nicht mehr über dem Slider liegt. Der Event muss an die Bühne geknüpft werden und der Ziehvorgang muss mittels einer Variable überwacht werden. Wenn du das Ganze in einer Movieclip oder Sprite Klasse unterbringst, siehe auch addedToStage, Einen Knackpunkt hat die Sache noch und zwar gibt es Probleme wenn man die Maus außerhalb des Flashfilms loslässt. Beschränkungsrechteck aus MC Koordinaten Nehmen wir mal an wir hätten eine MovieClip Instanz namens line_mc. An dieser Linie soll sich das Dreieck rauf und runter bewegen. Dann kann man sich die Koordinaten des Rechtecks auch direkt aus dem Movieclip line_mc ausgeben lassen. Ich setze voraus, dass sich das verschiebbare Dreieck und line_mc im selben Koordinatensystem befinden und dass Dreieck seinen Registrierpunkt in der Mitte hat. var rect:Rectangle = line_mc.getRect(line_mc.parent); |
//Dreieck, Anfasser für Slider
var dreieck:Sprite= new Sprite();
this.addChild(dreieck);
dreieck.x=20;
dreieck.y=20;
dreieck.graphics.beginFill(0x000000);
dreieck.graphics.lineTo(0,0);
dreieck.graphics.lineTo(15,-8.75);
dreieck.graphics.lineTo(15,8.75);
dreieck.graphics.endFill();
// Sensorpunkt Kreis unsichtbar
dreieck.graphics.beginFill(0x000000, 0);
dreieck.graphics.drawCircle(9, 0, 16);
//drag Slider
var draggin:Boolean=false;
function startSlide(evt:MouseEvent):void
{
draggin=true;
var rect:Rectangle=new Rectangle(20,20,0,300);
dreieck.startDrag(true, rect);
}
function stopSlide(evt:MouseEvent):void
{
if (draggin) {
dreieck.stopDrag();
}
draggin=false;
}
dreieck.addEventListener(MouseEvent.MOUSE_DOWN, startSlide);
stage.addEventListener(MouseEvent.MOUSE_UP, stopSlide);
Hier die Adobe Seite zum Thema
Hier mein AS2 Tipp zum Thema
In diesem Beispiel haben wir 3 buttons mit den Instanznamen play_btn, stop_btn, pause_btn sowie eine Slider Komponente mit Instanznamen lautstaerke. Es geht darum ein flv-Video namens zoo1.flv einzubinden und zu steuern. Man könnte auf den ersten Teil des Codes verzichten und stattdessen eine FLVPlayback Komponente auf die Bühne ziehen. Der Instanzname müsste in diesem Beispiel "video" sein und der Pfad zur flv-Datei könnte im Komponenten Inspektor angegeben werden.
Der letzte Teil des Codes bezieht sich auch die Lautstärkeregelung mittels der Slider-Komponente.
//flvPlayback Komponente "video"
import fl.video.*;
var video = new FLVPlayback();
video.x = 100;
video.y = 100;
addChild(video);
video.source = "zoo1.flv";
//video.skin = "SkinOverPlaySeekMute.swf"
//-------------------
video.stop();
video.autoRewind=true;
play_btn.addEventListener(MouseEvent.CLICK, abspielen);
stop_btn.addEventListener(MouseEvent.CLICK, anhalten);
pause_btn.addEventListener(MouseEvent.CLICK, pausieren);
function abspielen (evt:MouseEvent){
video.play();
};
function anhalten (evt:MouseEvent){
video.stop();
};
function pausieren (evt:MouseEvent){
video.pause();
};
//-------------------------------------------------------
import fl.controls.Slider;
import fl.events.SliderEvent;
import fl.controls.SliderDirection;
//Sliderkmponente "lautstaerke"
lautstaerke.value = video.volume;
lautstaerke.minimum = 0;
lautstaerke.maximum = 1;
lautstaerke.snapInterval = 0.1;
lautstaerke.liveDragging=true;
lautstaerke.addEventListener(SliderEvent.CHANGE, lautstaerkeAendern);
function lautstaerkeAendern(evt:SliderEvent) {
video.volume = evt.value;
}