Controllo della riproduzione di clip filmato

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

Flash utilizza la metafora della linea temporale per veicolare l'animazione o la modifica di uno stato. Qualunque elemento visivo che utilizza una linea temporale deve essere un oggetto MovieClip o essere un'estensione della classe MovieClip. Mentre ActionScript può indicare a qualunque filmato di fermarsi, avviare la riproduzione o passare a un altro punto della linea temporale, non può essere utilizzato per creare dinamicamente una linea temporale o aggiungere del contenuto in corrispondenza di determinati fotogrammi; ciò è possibile solo nello strumento di creazione di Flash.

Quando un oggetto MovieClip è in corso di riproduzione, avanza lungo la propria linea temporale a una velocità dettata dalla frequenza dei fotogrammi del file SWF. In alternativa, è possibile ignorare questa impostazione impostando la proprietà Stage.frameRate in ActionScript.

Riproduzione e interruzione di clip filmato

I metodi play() e stop() consentono il controllo di base di un clip filmato lungo tutta la linea temporale. Ad esempio, supponete che un simbolo di clip filmato sullo stage contenga l'animazione di una bicicletta che attraversa lo schermo, con il nome di istanza impostato su bicycle. Se il codice seguente è associato a un fotogramma della linea temporale principale,

bicycle.stop();

la bicicletta non si muove (cioè, la sua animazione non viene riprodotta). Il movimento della bicicletta può essere avviato mediante altre interazioni dell'utente. Ad esempio, se è presente un pulsante di nome startButton, il codice seguente su un fotogramma chiave della linea temporale fa in modo che il clic sul pulsante avvii la riproduzione dell'animazione:

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

Avanzamento veloce e riavvolgimento

I metodi play() e stop() non sono l'unico modo per controllare la riproduzione in un clip filmato. Potete anche muovere manualmente l'indicatore di riproduzione lungo la linea temporale utilizzando i metodi nextFrame() e prevFrame(). Se chiamate uno di questi metodi, la riproduzione viene interrotta e l'indicatore di riproduzione viene spostato rispettivamente in avanti o indietro.

L'utilizzo del metodo play() equivale a chiamare nextFrame() ogni volta che si attiva l'evento enterFrame dell'oggetto clip filmato. Lungo queste linee è possibile riprodurre il clip filmato bicycle al contrario creando un listener di eventi per l'evento Event.ENTER_FRAME e ordinando a bicycle di passare al proprio fotogramma precedente, come indicato di seguito:

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

Nella riproduzione normale, se un clip filmato contiene più di un solo fotogramma, viene ripetuto ciclicamente in modo indefinito durante la riproduzione; ovvero, ritorna al fotogramma 1 se avanza oltre il proprio fotogramma finale. Quando si utilizza prevFrame() o nextFrame(), questo comportamento non si verifica automaticamente (se si chiama prevFrame() quando l'indicatore di riproduzione si trova sul fotogramma 1, l'indicatore di riproduzione non viene spostato all'ultimo fotogramma). La condizione if nell'esempio precedente verifica se l'indicatore di riproduzione si è spostato all'indietro fino al primo fotogramma e imposta l'indicatore di riproduzione sul fotogramma finale, creando un ciclo continuo del clip filmato che viene eseguito all'indietro.

Passaggio a un fotogramma diverso e uso delle etichette di fotogramma

L'invio di un clip filmato a un nuovo fotogramma è un'operazione molto semplice. Se chiamate gotoAndPlay() o gotoAndStop(), il clip filmato passa al numero di fotogramma specificato come parametro. In alternativa, è possibile passare una stringa che corrisponde al nome dell'etichetta di fotogramma. Potete assegnare un'etichetta a qualunque fotogramma sulla linea temporale. A tale scopo, selezionate un fotogramma sulla linea temporale, quindi immettete un nome nel campo Etichetta fotogramma della finestra di ispezione Proprietà.

I vantaggi dell'utilizzo delle etichette di fotogramma anziché dei numeri sono particolarmente evidenti quando si crea un clip filmato complesso. Quando il numero di fotogrammi, livelli e interpolazioni in un'animazione diventa piuttosto elevato, è opportuno considerare di assegnare delle etichette ai fotogrammi più importanti con delle descrizioni eloquenti che rappresentino delle variazioni nel comportamento del clip filmato (ad esempio, “off”, “walking” o “running”). In questo modo si migliora la leggibilità del codice e si fornisce maggiore flessibilità, dal momento che le chiamate ActionScript utilizzate per passare a un fotogramma con un'etichetta sono dei puntatori a un singolo riferimento (l'etichetta) anziché a un numero di fotogramma specifico. Se successivamente decidete di spostare un segmento particolare dell'animazione in un fotogramma diverso, non è necessario modificare il codice ActionScript fintanto che si conserva la stessa etichetta per i fotogrammi nella nuova posizione.

Per rappresentare le etichette di fotogramma nel codice, ActionScript 3.0 include la classe FrameLabel. Ogni istanza di questa classe rappresenta una singola etichetta di fotogramma e ha una proprietà name che rappresenta il nome dell'etichetta di fotogramma specificato nella finestra di ispezione Proprietà e una proprietà frame che rappresenta il numero di fotogramma del fotogramma della linea temporale in cui si trova l'etichetta.

Per poter accedere alle istanze FrameLabel associate a un'istanza di clip filmato, la classe MovieClip include due proprietà che restituiscono direttamente degli oggetti FrameLabel. La proprietà currentLabels restituisce un array che è composto da tutti gli oggetti FrameLabel presenti sull'intera linea temporale di un clip filmato. La proprietà currentLabel restituisce una stringa contenente il nome dell'etichetta di fotogramma rilevato lungo la linea temporale.

Supponente di aver creato un clip filmato di nome robot e di aver assegnato delle etichette ai suoi vari stati di animazione. È possibile impostare una condizione che verifica la proprietà currentLabel per accedere allo stato corrente di robot, come nel codice seguente:

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

In Flash Player 11.3 e AIR 3.3 è stato aggiunto l'evento frameLabel alla classe FrameLabel. Potete assegnare un gestore di eventi all'istanza FrameLabel che rappresenta un'etichetta di fotogramma. L'evento viene inviato quando l'indicatore di riproduzione entra nel fotogramma.

Nell'esempio seguente viene creata un'istanza FrameLabel per la seconda etichetta di fotogramma nell'array di etichette dell'oggetto MovieClip. Quindi viene registrato un gestore di eventi per l'evento frameLabel:

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

Operazioni con le scene

Nell'ambiente di creazione di Flash, è possibile utilizzare le scene per demarcare una serie di linee temporali che verranno attraversate da un file SWF. Utilizzando il secondo parametro del metodo gotoAndPlay() o gotoAndStop(), potete specificare una scena a cui deve essere inviato l'indicatore di riproduzione. Tutti i file FLA cominciano solo con la scena iniziale, ma è possibile creare delle nuove scene.

L'uso delle scene non è sempre l'approccio migliore, poiché le scene presentano una serie di svantaggi. Un documento Flash che contiene più scene può essere difficile da gestire, in particolare in presenza di più autori. Le scene multiple possono anche rivelarsi inefficienti dal punto di vista della larghezza di banda, poiché il processo di pubblicazione unisce tutte le scene in un'unica linea temporale. Ciò provoca uno scaricamento progressivo di tutte le scene, anche se non vengono mai riprodotte. Per questi motivi, l'uso di più scene è spesso scoraggiato a meno che non siano necessarie per organizzare animazioni basate su più linee temporali.

La proprietà scenes della classe MovieClip è un array di oggetti Scene che rappresentano tutte le scene nel file SWF. La proprietà currentScene restituisce un oggetto Scene che rappresenta la scena che è in corso di riproduzione.

La classe Scene ha diverse proprietà che forniscono informazioni su una scena. La proprietà labels restituisce un array di oggetti FrameLabel che rappresentano le etichette di fotogramma in tale scena. La proprietà name restituisce il nome della scena sotto forma di stringa. La proprietà numFrames restituisce un int che rappresenta il numero totale di fotogrammi nella scena.