Styra uppspelning av filmklipp

Flash Player 9 och senare, Adobe AIR 1.0 och senare

I Flash används metaforen tidslinje för förmedling av animering eller en ändring av läget. Alla visuella element som använder en tidslinje måste antingen vara ett MovieClip-objekt eller komma från klassen MovieClip. Ett ActionScript kan instruera ett filmklipp att stoppa, spela upp eller flytta till en annan punkt på tidslinjen men det kan inte användas för att dynamiskt skapa en tidslinje eller lägga till innehåll i specifika bildrutor; det går endast att göra med Flash-utvecklingsverktyget.

När ett MovieClip spelas upp, förflyttas det längs sin tidslinje med en hastighet som anges av bildrutehastigheten i SWF-filen. Alternativt kan du åsidosätta inställningen genom att ange egenskapen Stage.frameRate i ActionScript.

Spela upp filmklipp och stoppa uppspelningen

Med metoderna play() och stop() får du baskontroll över ett filmklipp längs dess tidslinje. Antag att du t.ex. har en filmklippssymbol på scenen som innehåller en animering av en cykel som förflyttas över skärmen och har instansnamnet bicycle . Om följande kod har lagts till i en nyckelbildruta på huvudtidslinjen,

bicycle.stop();

kommer cykeln inte att röra sig (animeringen spelas inte upp). Cykelns rörelse kunde inte starta på grund av någon annan användaråtgärd. Om du t.ex. har en knapp med namnet startButton och följande kod finns i en nyckelbildruta på huvudtidslinjen, spelas animeringen upp när du klickar på knappen:

// 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);

Snabbspolning framåt och bakåt

Metoderna play() och stop() är inte det enda sättet att styra uppspelningen i ett filmklipp. Du kan också flytta spelhuvudet framåt och bakåt längs tidslinjen manuellt med metoderna nextFrame() och prevFrame() . När någon av de här metoderna anropas, stoppas uppspelningen och spelhuvudet flyttas en bildruta framåt respektive bakåt.

Metoden play() är jämförbar med att anropa nextFrame() varje gång filmklippsobjektets enterFrame -händelse aktiveras. Längs de här linjerna kan du få filmklippet bicycle att spelas upp baklänges genom att skapa en händelseavlyssnare för enterFrame -händelsen och instruera bicycle att gå till den föregående bildrutan i avlyssningsfunktionen enligt följande:

// 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);

I en vanlig uppspelning, om filmklippet innehåller fler än en bildruta, kommer det att upprepas oavbrutet under uppspelningen; d.v.s. återgå till bildruta 1 om det fortsätter förbi sin sista bildruta. När du använder prevFrame() eller nextFrame() , sker inte det här automatiskt (anrop av prevFrame() när spelhuvudet är på bildruta 1 flyttar inte spelhuvudet till den sista bildrutan). Villkoret if i exemplet ovan kontrollerar om spelhuvudet har gått bakåt till den första bildrutan och flyttar spelhuvudet framåt till dess sista bildruta och skapar på så sätt effektivt en kontinuerlig slinga som spelar upp filmklippet baklänges.

Hoppa till en annan bildruta och använda bildruteetiketter

Att skicka ett filmklipp till en ny bildruta är enkelt. Genom att anropa antingen gotoAndPlay() eller gotoAndStop() får du filmklippet att hoppa till det bildrutenummer som anges i en parameter. Alternativt kan du skicka en sträng som matchar namnet på en bildruteetikett. Alla bildrutor i tidslinjen kan tilldelas en etikett. Det gör du genom att välja en bildruta på tidslinjen och sedan ange ett namn i fältet Bildruteetikett i egenskapsinspektören.

Fördelarna med att använda bildruteetiketter i stället för nummer blir särskilt uppenbart när du skapar komplexa filmklipp. När antalet bildrutor, lager och interpoleringar blir stort i en animering, bör du överväga att sätta etiketter med förklarande beskrivningar på viktiga bildrutor som representerar ändrat beteende i filmklippet (t.ex. ”av”, ”gå” eller ”springa”). Det förbättrar kodens läsbarhet och ger även flexibilitet eftersom ActionScript-anrop som går till en bildruteetikett är pekare till en enstaka referens, etiketten, i stället för ett visst bildrutenummer. Om du senare bestämmer dig för att flytta ett visst segment av animeringen till en annan bildruta, behöver du inte ändra ActionScript-koden så länge som du behåller samma etikett för bildrutorna på den nya platsen.

Använd klassen FrameLabel i ActionScript 3.0 för representation av bildruteetiketter i koden. Varje instans av den här klassen representerar en enstaka bildruteetikett och har en name -egenskap som representerar namnet på bildruteetiketten enligt specifikationen i egenskapsinspektören och en frame -egenskap som representerar bildrutenumret för bildrutan där etiketten har placerats på tidslinjen.

För att komma till FrameLabel-instansen som hör ihop med en filmklippsinstans, ingår det två egenskaper i klassen MovieClip som returnerar FrameLabel-objekt direkt. Egenskapen currentLabels returnerar en array som består av alla FrameLabel-objekt som finns på en tidslinje i ett filmklipp. Egenskapen currentLabel returnerar en sträng som innehåller namnet på bildruteetiketten som påträffades senast längs tidslinjen.

Antag att du höll på att skapa ett filmklipp med namnet robot och har angett en etikett för de olika lägena i animationen. Du kan ange ett villkor som kontrollerar egenskapen currentLabel för att komma till det aktuella läget i robot enligt följande kod:

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

I Flash Player 11.3 och AIR 3.3 har händelsen frameLabel lagts till i klassen FrameLabel. Du kan tilldela en händelsehanterare till den FrameLabel-instans som representerar en bildruteetikett. Händelsen skickas när spelhuvudet når bildrutan.

I följande exempel skapas en FrameLabel-instans för den andra bildruteetiketten i arrayen med bildruteetiketter för MovieClip. Sedan registreras en händelsehanterare för händelsen frameLabel :

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

Arbeta med scener

I Flash-utvecklingsmiljön kan du använda scener för att avgränsa en serie tidslinjer som SWF-filen kommer att gå igenom. När du använder den andra parametern för metoderna gotoAndPlay() eller gotoAndStop() kan du ange till vilken scen spelhuvudet ska skickas. Alla FLA-filer startar endast med den initiala scenen men du kan skapa nya scener.

Att använda scener är inte alltid den bästa lösningen eftersom det finns några nackdelar med dem. Ett Flash-dokument som innehåller flera scener kan vara svårt att underhålla, särskilt i en miljö med flera författare. Flera scener kan också vara ineffektivt avseende bandbredd, eftersom publiceringsprocessen sammanfogar alla scener till en enda tidslinje. Det här förorsakar en progressiv nedladdning av alla scener även om de inte spelas upp. På grund av detta bör flera scener inte användas förutom då flera långa tidslinjebaserade animeringar ska organiseras.

Egenskapen scenes i klassen MovieClip returnerar en array av Scene-objekt som representerar alla scener i SWF-filen. Egenskapen currentScene returnerar ett Scene-objekt som representerar den aktuella scenen som spelas upp.

Klassen Scene har flera egenskaper som ger information om scenen. Egenskapen labels returnerar en array av FrameLabel-objekt som representerar bildruteetiketterna på den scenen. Egenskapen name returnerar scenens namn som en sträng. Egenskapen numFrames returnerar ett int-objekt som representerar det totala antalet bildrutor på scenen.