Animazione di oggetti

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

Si definisce animazione il processo di mettere qualcosa in movimento, oppure di modificare qualcosa in un determinato arco di tempo. L'animazione con script è una parte fondamentale dei videogiochi e viene spesso utilizzata per aggiungere un tocco di ricercatezza e utili indicazioni di interazione ad altre applicazioni.

L'idea fondamentale alla base dell'animazione con script è il verificarsi di un cambiamento suddiviso in incrementi lungo un intervallo temporale. In ActionScript, rendere un processo ripetitivo è facile, grazie a una comune istruzione ciclica. Tuttavia, un ciclo deve eseguire tutte le sue iterazioni prima di aggiornare lo schermo. Per creare un'animazione mediante script, è necessario scrivere un codice ActionScript che consenta di eseguire alcune azioni in modo ripetuto nel tempo, così come di aggiornare lo schermo ogni volta che tale script viene eseguito.

Si potrebbe, ad esempio, creare una semplice animazione, quale una palla che attraversa lo schermo. ActionScript include un semplice meccanismo che consente di tenere traccia del passaggio del tempo e di aggiornare lo schermo di conseguenza; vale a dire, potete scrivere un codice in grado di fare percorrere alla palla una piccola porzione di spazio durante ogni porzione di tempo, fino a portarla a destinazione. Dopo ogni singolo movimento, lo schermo viene aggiornato, rendendo visibile un movimento che attraversa lo stage.

Dal punto di vista pratico, è opportuno sincronizzare l'animazione mediante script con la frequenza dei fotogrammi del file SWF, ovvero effettuare una variazione dell'animazione ogni volta che viene o verrebbe visualizzato un nuovo fotogramma, in quanto la frequenza dei fotogrammi corrisponde alla frequenza di aggiornamento dello schermo da parte di Flash Player. Ogni oggetto di visualizzazione presenta un evento enterFrame che viene inviato in base alla velocità fotogrammi del file SWF, a un evento per fotogramma. La maggior parte degli sviluppatori che creano animazioni mediante script impiegano l'evento enterFrame come strumento per creare azioni che si ripetono nel tempo. È possibile scrivere un codice listener per l'evento enterFrame che consenta di spostare la palla animata di una determinata porzione di spazio per ogni fotogramma, affinché, con l'aggiornamento dello schermo (a ogni fotogramma) la palla venga ridisegnata nella nuova posizione, creando un effetto di movimento.

Nota: per eseguire un'azione in modo ripetuto nel tempo, potete anche utilizzare la classe Timer. Un'istanza di Timer attiva una notifica evento al trascorre di ogni determinato intervallo di tempo. È possibile scrivere un codice che consenta di eseguire l'animazione mediante la gestione dell'evento timer della classe timer, impostando l'intervallo di tempo su un valore molto basso (frazioni di secondo). Per ulteriori informazioni sull'uso della classe Timer, vedete la sezione Controllo degli intervalli di tempo .

Nell'esempio seguente, viene creata sullo stage un'istanza di Sprite a forma di cerchio denominata circle . Quando l'utente fa clic sul cerchio, viene avviata una sequenza animata mediante script che provoca la dissolvenza di circle (la sua proprietà alpha viene diminuita) fino a renderlo completamente trasparente:

import flash.display.Sprite; 
import flash.events.Event; 
import flash.events.MouseEvent; 
 
// draw a circle and add it to the display list 
var circle:Sprite = new Sprite(); 
circle.graphics.beginFill(0x990000); 
circle.graphics.drawCircle(50, 50, 50); 
circle.graphics.endFill(); 
addChild(circle); 
 
// When this animation starts, this function is called every frame. 
// The change made by this function (updated to the screen every 
// frame) is what causes the animation to occur. 
function fadeCircle(event:Event):void 
{ 
    circle.alpha -= .05; 
     
    if (circle.alpha <= 0) 
    { 
        circle.removeEventListener(Event.ENTER_FRAME, fadeCircle); 
    } 
} 
 
function startAnimation(event:MouseEvent):void 
{ 
    circle.addEventListener(Event.ENTER_FRAME, fadeCircle); 
} 
 
circle.addEventListener(MouseEvent.CLICK, startAnimation);

Quando l'utente fa clic sul cerchio, la funzione fadeCircle() viene registrata come listener dell'evento enterFrame e inizia a essere chiamata a ogni passaggio di fotogramma. Tale funzione provoca una dissolvenza di circle modificando la sua proprietà alpha ; a ogni fotogramma, la proprietà alpha di circle viene diminuita di 0,05 (5 percento) e lo schermo viene aggiornato di conseguenza. Alla fine, quando il valore di alpha raggiunge 0 (e circle è completamente trasparente), la funzione fadeCircle() viene rimossa come listener dell'evento e l'animazione termina.

Lo stesso codice può essere utilizzato, ad esempio, per creare una vera e propria animazione, anziché una dissolvenza. Sostituendo la proprietà alpha con una proprietà differente nella funzione che viene registrata come listener dell'evento enterFrame , tale proprietà risulta animata. Se, ad esempio, si modifica la riga

    circle.alpha -= .05;

nel seguente codice

    circle.x += 5;

la proprietà x risulta animata e il cerchio viene spostato verso destra attraverso lo stage. La condizione che termina l'animazione (vale a dire, l'annullamento della registrazione come listener di enterFrame ) può essere modificata quando viene raggiunta la coordinata x desiderata.