Afspelen van filmclips besturen

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

Flash gebruikt de metafoor van een tijdlijn om animatie of wijzigingen in een toestand over te brengen. Alle visuele elementen die van een tijdlijn gebruikmaken, moeten een object MovieClip zijn of een uitbreiding van de klasse MovieClip. Hoewel ActionScript elke filmclip kan laten stoppen, afspelen of naar een ander punt in de tijdlijn kan verplaatsen, kan ActionScript niet worden gebruikt om dynamisch een tijdlijn te maken of inhoud aan specifieke frames toe te voegen. Dit kan alleen worden gedaan via het Flash-ontwerpgereedschap.

Wanneer een filmclip wordt afgespeeld, beweegt deze in de tijdlijn met een snelheid die door de framesnelheid van het SWF-bestand wordt bepaald. U kunt deze instelling ook overschrijven door de eigenschap Stage.frameRate in ActionScript te configureren.

Filmclips afspelen en het afspelen stoppen

De methoden play() en stop() bieden basisbesturingselementen voor een filmclip in de tijdlijn. U hebt bijvoorbeeld een filmclipsymbool in het werkgebied waarin een animatie van een over het scherm bewegende fiets is opgenomen. De instantienaam is ingesteld op bicycle (fiets). Als de volgende code aan een hoofdframe in de hoofdtijdlijn is gekoppeld,

bicycle.stop();

beweegt de fiets niet (de animatie wordt niet afgespeeld). De beweging van de fiets kan worden gestart via een andere gebruikersinteractie. Als er bijvoorbeeld een knop met de naam startButton aanwezig is, zorgt de volgende code voor een hoofdframe in de hoofdtijdlijn ervoor dat de animatie door het klikken op de knop wordt afgespeeld:

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

Snel vooruitspoelen en terugspoelen

De methoden play() en stop() vormen niet de enige manier om het afspelen van een filmclip te beheren. U kunt de afspeelkop ook handmatig vooruit of achteruit in de tijdlijn verplaatsen met behulp van de methoden nextFrame() en prevFrame() . Door het aanroepen van deze methoden wordt het afspelen gestopt en wordt de afspeelkop respectievelijk een frame vooruit of achteruit verplaatst.

Het gebruik van de methode play() is gelijk aan het aanroepen van nextFrame() , telkens wanneer de gebeurtenis enterFrame van het filmclipobject wordt geactiveerd. Op dezelfde manier kunt u de filmclip bicycle achterwaarts afspelen door een gebeurtenislistener voor de gebeurtenis enterFrame te maken en bicycle in de listenerfunctie opdracht te geven naar het vorige frame te gaan. U doet dit als volgt:

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

Als een filmclip bij normaal afspelen meer dan een frame bevat, wordt de clip in een doorlopende lus afgespeeld. Dat wil zeggen dat de clip na het passeren van het laatste frame naar frame 1 terugkeert. Wanneer u prevFrame() of nextFrame() gebruikt, gebeurt dit niet automatisch (als u prevFrame() aanroept wanneer de afspeelkop zich op frame 1 bevindt, wordt de afspeelkop niet naar het laatste frame verplaatst). De voorwaarde if in het bovenstaande voorbeeld controleert of de afspeelkop achterwaarts naar het eerste frame is verplaatst en stelt de afspeelkop voor het laatste frame in. Daarmee wordt een doorlopende lus gemaakt, waarin de filmclip achterwaarts wordt afgespeeld.

Naar een ander frame springen en framelabels gebruiken

Het is bijzonder eenvoudig om een filmclip naar een nieuw frame te sturen. U roept gotoAndPlay() of gotoAndStop() aan. De filmclip springt dan naar het framenummer dat als parameter is opgegeven. U kunt ook een tekenreeks doorgeven, die overeenkomt met de naam van een framelabel. U kunt een label aan alle frames in de tijdlijn toewijzen. U doet dit door een frame in de tijdlijn te selecteren en een naam in het veld Framelabel van Eigenschapcontrole in te vullen.

De voordelen van het gebruik van framelabels in plaats van nummers worden vooral duidelijk wanneer u een ingewikkelde filmclip maakt. Wanneer het aantal frames, lagen en tweens in een animatie groot wordt, kunt u belangrijke frames een label geven met verklarende beschrijvingen over ander gedrag van de filmclip (bijvoorbeeld ‘uit’, ‘lopen’ of ‘rennen’). Hierdoor wordt de leesbaarheid van de code verhoogd. Deze methode biedt tevens flexibiliteit, aangezien ActionScript-aanroepen die naar een frame met een label gaan, naar een enkele referentie verwijzen (het label), in plaats van naar een specifiek framenummer. Als u later besluit een bepaald segment van de animatie naar een ander frame te verplaatsen, hoeft u de ActionScript-code niet te wijzigen, als u voor de frames in de nieuwe locatie tenminste hetzelfde label gebruikt.

ActionScript 3.0 bevat de klasse FrameLabel voor het vertegenwoordigen van framelabels in code. Elke instantie van deze klasse vertegenwoordigt een enkel framelabel en heeft een eigenschap name waarmee de naam van het framelabel volgens de specificatie in Eigenschapcontrole wordt aangegeven, en een eigenschap frame waarmee het framenummer (de plaats van het frame in de tijdlijn) wordt aangegeven.

Voor toegang tot FrameLabel-instanties die aan een filmclipinstantie zijn gekoppeld, bevat de klasse MovieClip twee eigenschappen waarmee direct objecten FrameLabel worden geretourneerd. De eigenschap currentLabels retourneert een array dat uit alle objecten FrameLabel in de volledige tijdlijn van een filmclip bestaat. De eigenschap currentLabel retourneert een reeks met de naam van het framelabel dat het laatst op de tijdlijn is aangetroffen.

Stel dat u een filmclip met de naam robot maakt, waarbij u een label aan de verschillende toestanden van de animatie geeft. U kunt een voorwaarde instellen, waarmee de eigenschap currentLabel wordt gecontroleerd op toegang tot de huidige toestand van robot , zoals in de volgende code:

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

In Flash Player 11.3 en AIR 3.3 is de gebeurtenis frameLabel toegevoegd aan de FrameLabel-klasse. U kunt een gebeurtenishandler toewijzen aan de FrameLabel-instantie die een framelabel vertegenwoordigt. De gebeurtenis wordt verzonden wanneer de afspeelkop het frame betreedt.

In het volgende voorbeeld wordt een FrameLabel-instantie gemaakt voor het tweede framelabel in de array met framelabels voor de MovieClip. Vervolgens wordt een gebeurtenishandler geregistreerd voor de gebeurtenis frameLabel :

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

Werken met scènes

In de Flash-ontwerpomgeving kunt u scènes gebruiken voor het omsluiten van een serie tijdlijnen die een SWF-bestand doorloopt. Als u de tweede parameter van de methoden gotoAndPlay() of gotoAndStop() gebruikt, kunt u opgeven naar welke scène de afspeelkop wordt verplaatst. Alle FLA-bestanden beginnen met alleen de eerste scène, maar u kunt ook nieuwe scènes maken.

Het gebruik van scènes is niet altijd de beste oplossing, omdat scènes een aantal nadelen hebben. Een Flash-document dat meerdere scènes bevat, kan moeilijk te onderhouden zijn, met name in omgevingen met meerdere ontwikkelaars. Meerdere scènes zijn ook niet erg efficiënt qua bandbreedte, omdat alle scènes door het publicatieproces in een enkele tijdlijn worden samengevoegd. Hierdoor worden alle scènes progressief gedownload, zelfs als ze nooit worden afgespeeld. Daarom wordt het gebruik van meerdere scènes vaak afgeraden, behalve bij het ordenen van lange animaties die op meerdere tijdlijnen zijn gebaseerd.

De eigenschap scenes van de klasse MovieClip retourneert een array Scene-objecten die alle scènes van het SWF-bestand vertegenwoordigen. De eigenschap currentScene retourneert een object Scene dat de op dat moment afgespeelde scène vertegenwoordigt.

De klasse Scene biedt verschillende eigenschappen die informatie over een scène geven. De eigenschap labels retourneert een array FrameLabel-objecten die de framelabels in die scène vertegenwoordigen. De eigenschap name retourneert de naam van de scène als tekenreeks. De eigenschap numFrames retourneert een geheel getal dat het totale aantal frames in de scène vertegenwoordigt.