Steuern der Wiedergabe von Movieclips

Flash Player 9 und höher, Adobe AIR 1.0 und höher

In Flash werden Animationen oder Statusänderungen mithilfe einer Zeitleiste dargestellt. Bei allen visuellen Elementen mit einer Zeitleiste muss es sich entweder um MovieClip-Objekte oder um Objekte handeln, die von der MovieClip-Klasse abgeleitet sind. Mit ActionScript können Movieclips zwar gestoppt, wiedergegeben oder der Abspielkopf an einen anderen Punkt der Zeitleiste verschoben werden, Zeitleisten können jedoch nicht dynamisch über ActionScript erstellt werden. Zudem können keine Inhalte in spezifische Bilder eingefügt werden. Dies ist nur mit dem Flash-Authoring-Tool möglich.

Bei der Wiedergabe eines MovieClip-Objekts erfolgt der Wiedergabeverlauf entlang der entsprechenden Zeitleiste mit einer Geschwindigkeit, die durch die Bildrate der SWF-Datei vorgegeben ist. Alternativ können Sie diese Einstellung durch Festlegen der Stage.frameRate-Eigenschaft in ActionScript überschreiben.

Wiedergeben von Movieclips und Stoppen der Wiedergabe

Mit den Methoden play() und stop() können Movieclips in der entsprechenden Zeitleiste gesteuert werden. Beispiel: Sie erstellen auf der Bühne ein Movieclip-Symbol eines über den Bildschirm fahrenden Fahrrads. Als Instanzname des Movieclip-Symbols geben Sie dabei bicycle an. Dann wird der folgende Code mit einem Schlüsselbild auf der Hauptzeitleiste verknüpft:

bicycle.stop();

Das Fahrrad bewegt sich nicht (die entsprechende Animation wird nicht wiedergegeben). Die Bewegung des Fahrrads kann auch durch eine andere Benutzerinteraktion gestartet werden. Beispielsweise kann mit dem folgenden Code über eine Schaltfläche mit dem Namen startButton in einem Schlüsselbild der Hauptzeitleiste festgelegt werden, dass durch Klicken auf diese Schaltfläche die Animation gestartet wird:

// This function will be called when the button is clicked. It causes the  
// bicycle animation to play. 
function playAnimation(event:MouseEvent):void 
{ 
    bicycle.play(); 
} 
// Register the function as a listener with the button. 
startButton.addEventListener(MouseEvent.CLICK, playAnimation);

Vorspulen und Zurückspulen

Die Wiedergabe in einem Movieclip kann nicht nur durch die Methoden play() und stop() gesteuert werden. Sie können den Abspielkopf auch mithilfe der Methoden nextFrame() und prevFrame() auf der Zeitleiste vor- oder zurückbewegen. Durch den Aufruf einer dieser Methoden werden die Wiedergabe gestoppt und der Abspielkopf jeweils zum nächsten bzw. vorherigen Bild bewegt.

Die Verwendung der play()-Methode entspricht dem Aufruf von nextFrame() bei jedem Auslösen des enterFrame-Ereignisses für ein MovieClip-Objekt. Dementsprechend können Sie den bicycle-Movieclip zurückspulen, indem Sie einen Ereignis-Listener für das enterFrame-Ereignis erstellen und bicycle wie folgt auf das vorherige Bild in der Listener-Funktion zurücksetzen:

// This function is called when the enterFrame event is triggered, meaning  
// it's called once per frame. 
function everyFrame(event:Event):void 
{ 
    if (bicycle.currentFrame == 1) 
    { 
        bicycle.gotoAndStop(bicycle.totalFrames); 
    } 
    else 
    { 
        bicycle.prevFrame(); 
    } 
} 
bicycle.addEventListener(Event.ENTER_FRAME, everyFrame);

Wenn ein Movieclip mehrere Bilder enthält, wird er bei der normalen Wiedergabe endlos durchlaufen, d. h. er wird nach dem letzten Bild wieder auf Bild 1 zurückgesetzt. Bei Verwendung von prevFrame() oder nextFrame() erfolgt dieses Verhalten nicht automatisch (wenn sich der Abspielkopf beim Aufruf von prevFrame() auf Bild 1 befindet, wird er nicht zum letzten Bild bewegt). Mit der if-Bedingung in diesem Beispiel wird überprüft, ob der Abspielkopf rückwärts zum ersten Bild bewegt wurde. In diesem Fall wird der Abspielkopf vorwärts zum letzten Bild bewegt, sodass eine Endlosschleife für den Movieclip entsteht, in der er rückwärts wiedergegeben wird.

Springen zu anderen Bildern und Verwenden von Bildbeschriftungen

Ein Movieclip kann ganz einfach auf ein neues Bild gesetzt werden. Durch Aufrufen von gotoAndPlay() oder gotoAndStop() springt der Movieclip zu der Bildnummer, die als Parameter angegeben ist. Alternativ können Sie einen String angeben, der dem Namen einer Bildbeschriftung entspricht. Jedem Bild in der Zeitleiste kann eine Beschriftung zugewiesen werden. Wählen Sie dazu ein Bild in der Zeitleiste aus und geben Sie dann im Eigenschafteninspektor im Feld „Bildbeschriftung“ einen Namen ein.

Die Vorteile der Verwendung von Bildbeschriftungen anstelle von Bildnummern machen sich beim Erstellen komplexer Movieclips besonders bemerkbar. Wenn eine Animation viele Bilder, Ebenen und Tweens enthält, sollten Sie wichtige Bilder mit Beschriftungen versehen, die Änderungen in der Animation des Movieclips angeben (z. B. „off“, „walking“ oder „running“). Dies verbessert die Lesbarkeit des Codes und ermöglicht zudem eine flexible Verwendung, da es sich bei ActionScript-Aufrufen für ein beschriftetes Bild um Zeiger auf einen einzelnen Verweis (die Beschriftung) und nicht auf eine bestimmte Bildnummer handelt. Wenn Sie zu einem späteren Zeitpunkt ein bestimmtes Animationssegment in ein anderes Bild verschieben möchten, müssen Sie den ActionScript-Code nur ändern, wenn Sie für die Bilder an der neuen Position andere Beschriftungen verwenden.

Mithilfe der FrameLabel-Klasse von ActionScript 3.0 können Bildbeschriftungen im Code verwendet werden. Jede Instanz dieser Klasse repräsentiert jeweils eine Bildbeschriftung und verfügt über eine name-Eigenschaft für den Namen der Bildbeschriftung im Eigenschafteninspektor und über eine frame-Eigenschaft für die Bildnummer des Bilds, für das die Beschriftung auf der Zeitleiste positioniert wird.

Damit die mit einer MovieClip-Instanz verknüpften FrameLabel-Instanzen abgerufen werden können, enthält die MovieClip-Klasse zwei Eigenschaften, die direkt FrameLabel-Objekte zurückgeben. Mit der currentLabels-Eigenschaft wird ein Array zurückgegeben, das alle FrameLabel-Objekte in der gesamten Zeitleiste eines Movieclips enthält. Mit der currentLabel-Eigenschaft wird ein String zurückgegeben, der den Namen der zuletzt auf der Zeitleiste angetroffenen Bildbeschriftung enthält.

Wenn Sie einen Movieclip mit dem Namen robot erstellen und die verschiedenen Animationsbewegungen mit Beschriftungen versehen haben, können Sie beispielsweise eine Bedingung festlegen, mit der die currentLabel-Eigenschaft überprüft wird, um die aktuelle Bewegung von robot abzurufen, wie im folgenden Codebeispiel dargestellt:

if (robot.currentLabel == "walking") 
{ 
    // do something  
}

In Flash Player 11.3 und AIR 3.3 wurde das frameLabel-Ereignis zur FrameLabel-Klasse hinzugefügt. Sie können der FrameLabel-Instanz, die eine Bildbeschriftung darstellt, eine Ereignisprozedur zuweisen. Das Ereignis wird abgesetzt, wenn der Abspielkopf in das Bild eintritt.

Im folgenden Beispiel wird eine FrameLabel-Instanz für die zweite Bildbeschriftung im Array mit Bildbeschriftungen für den MovieClip erstellt. Dann wird eine Ereignisprozedur für das frameLabel-Ereignis registriert:

var myFrameLabel:FrameLabel = robot.currentLabels[1]; 
myFrameLabel.addEventListener(Event.FRAME_LABEL, onFrameLabel); 
 
function onFrameLabel(e:Event):void { 
    //do something 
}

Arbeiten mit Szenen

In der Flash-Authoring-Umgebung können Sie mithilfe von Szenen mehrere Zeitleisten festlegen, entlang derer eine SWF-Datei wiedergegeben wird. Über den zweiten Parameter der gotoAndPlay()-Methode oder der gotoAndStop()-Methode können Sie eine Szene angeben, zu der der Abspielkopf bewegt wird. Alle FLA-Dateien beginnen lediglich mit der Anfangsszene, Sie können jedoch neue Szenen erstellen.

Die Verwendung von Szenen ist nicht immer die am besten geeignete Methode, da dies eine Reihe von Nachteilen mit sich bringt. Ein Flash-Dokument mit mehreren Szenen ist unter Umständen schwer zu verwalten, vor allem in Umgebungen mit mehreren Programmierern. Die Verwendung mehrerer Szenen kann sich zudem negativ auf die Bandbreite auswirken, da beim Veröffentlichen alle Szenen in einer einzigen Zeitleiste zusammengeführt werden. Dies führt zu einem progressiven Download aller Szenen, selbst wenn diese nie wiedergegeben werden. Aus diesen Gründen wird von der Verwendung mehrerer Szenen häufig abgeraten, es sei denn zum Strukturieren mehrerer Animationen mit Zeitleisten.

Mit der scenes-Eigenschaft der MovieClip-Klasse wird ein Array mit Scene-Objekten zurückgegeben, in dem alle Szenen in der SWF-Datei angegeben sind. Mit der currentScene-Eigenschaft wird ein Scene-Objekt für die derzeit wiedergegebene Szene zurückgegeben.

Die Scene-Klasse verfügt über mehrere Eigenschaften, die Informationen zu einer Szene bereitstellen. Die labels-Eigenschaft gibt ein Array mit FrameLabel-Objekten mit den Bildbeschriftungen in dieser Szene zurück. Mit der name-Eigenschaft wird der Name der Szene als String zurückgegeben. Mit der numFrames-Eigenschaft wird eine Ganzzahl zurückgegeben, die die Gesamtanzahl der Bilder in einer Szene angibt.