AS3 Class.ScaleSquare Porting
Ricompilazione della classe ScaleSquare in ActionScript 3
Inserito il 05-07-2007
Visto il positivo riscontro verso la mia classe personale ScaleSquare, scritta per Flash Mx 2004 e successivi, in ActionScript 2, ho deciso, un po' anche per imparare a gestire questo "nuovo" linguaggio, di fare il porting della classe in ActionScript 3.
Potete scaricare la classe dal link ../classes/AS3ScaleSquare.as
Effettivamente in AS3 tutto l'apparato di gestione degli script è stato profondamente modificato e, nonostante esistano ancora i costrutti classici della programmazione, ogni elemento precedente è stato spostato o sostituito con altri, utilizzando una modularizzazione a classi, tipica dei linguaggi Object Oriented.
Grazie a questa modularizzazione il codice appare più snello, ogni azione viene presa in carico da un singolo elemento, così avremo ad esempio una classe che si occupa solo dei caricamenti esterni, una che potrà contenere solo elementi disegnati, una che conterrà elementi di tipo bitmap e così via. E' chiaro a questo punto che il codice scritto a suo tempo per AS2 non possa più essere sfruttato nella nuova versione, fatto salvo il caso di pubblicare ancora per una versione precedente del Flash Player.
L'utilizzo della classe non cambia, se ne istanzia un nuovo oggetto sul frame specificandone i parametri che si vuole modificare.
// importo le easing functions, come facevo in AS2 // l'unica differenza è che le cerco in un package diverso (fl invece che mx) import fl.transitions.easing.*; // richiamo la classe attraverso il costruttore, con i suoi parametri var s:AS3ScaleSquare = new AS3ScaleSquare(myDispObj, 5, 5, Bounce.easeOut, true, 1, 1);
Il costruttore della classe è così composto:
public function AS3ScaleSquare (target:DisplayObjectContainer=null, xSections:Number=1, ySections:Number=1, easeType:Function=null, random:Boolean=false, duration:Number=Infinity, singleTweenDuration:Number=1)
Di seguito i parametri, compresi del loro valore di default*:
- target:DisplayObjectContainer=null -> è l'oggetto contenitore a cui viene assegnata la maschera che genera l'effetto, ha un valore di default pari a Null e gestisce l'avvio della classe in maniera immediata, o mediante la funzione startAnimation che vedremo più avanti; in pratica se non viene passato nessun parametro al costruttore, l'animazione non viene eseguita subito;
- xSections:Number=1 -> rappresenta il numero di sezioni orizzontali in cui si deve dividere la maschera, il valore di default è pari a 1;
- ySections:Number=1 -> rappresenta il numero di sezioni verticali in cui si deve dividere la maschera, il valore di default è pari a 1;
- easeType:Function=null -> rappresenta la funzione di movimento da utilizzare nell'animazione, il valore di default è Null ed equivale alla funzione None.easeNone;
- random:Boolean=false -> se true, dice alla classe di animare la griglia della maschera in maniera casuale, il valore di default è false;
- duration:Number=Infinity -> equivale alla durata in secondi della transizione ed ha un valore di default di 1, equivalente ad un secondo;
- singleTweenDuration:Number=1 -> determina il valore di durata dell'animazione di ogni singolo rettangolo che compone la maschera a griglia, ha un valore pari a 1 ossia la durata di un secondo per l'animazione di ogni rettangolo; se viene impostato a 0, la durata di ogni singola animazione viene determinata dalla durata dell'intera animazione divisa per il numero di sezioni da animare.
Gli stessi parametri configurabili nel costruttore della classe, sono accessibili come proprietà dell'istanza, in modalità read/write, perciò possono essere sovrascritti con nuovi valori.
La classe prevede anche tre metodi, che riporto di seguito:
- public function startAnimation():void -> il metodo consente, se non c'è già un'animazione attiva quando viene richiamato, di riattivare l'animazione; volendo è possibile assegnare un costruttore senza parametri ad una istanza, settare il target tramite il richiamo della proprietà rispettiva e richiamare l'animazione con il metodo, come da esempio:
// attenzione: non è possibile attivare il metodo se il target non è stato definito
var ssq:AS3ScaleSquare = new AS3ScaleSquare();
ssq.target = myDispObj;
ssq.xSections = 10;
ssq.ySections = 1;
ssq.easeType = Bounce.easeOut;
ssq.startAnimation();
- public function clearAnimation():void -> annulla l'esecuzione dell'animazione e libera il target dalla maschera.
- public function addEventListener(type:String, listener:Function):void -> associa una funzione specifica al verificarsi di un determinato evento, seguendo il modello ad eventi così come è stato introdotto in AS3; la classe reagisce a due eventi, "COMPLETE" e "CANCEL", che rispettivamente gestiscono il momento in cui viene completata l'animazione e quello in cui viene richiamato il metodo clearAnimation(); il metodo di applicazione equivale a quello utilizzato con le classi standard, perciò riprendendo l'esempio precendente, avremo:
var ssq:AS3ScaleSquare = new AS3ScaleSquare();
ssq.addEventListener(Event.COMPLETE, completeHandler);
ssq.addEventListener(Event.CANCEL, cancelHandler);
function completeHandler(e:Event) {
trace("Animazione completata!");
}
function cancelHandler(e:Event) {
trace("Animazione interrotta!");
}
ssq.target = myDispObj;
ssq.xSections = 10;
ssq.ySections = 1;
ssq.easeType = Bounce.easeOut;
ssq.startAnimation();Questo è quanto, la classe presenta qualche imperfezione, soffre della scarsa precisione dei metodi di controllo del tempo, tipici di Flash (setInterval e setTimeout, a cui si è aggiunta la classe Timer altrettanto imprecisa), ma nel complesso, se usata con oculatezza e non sovraccaricata da troppe sezioni, fa egregiamente il suo lavoro e la sua bella figura in presentazione. Le prestazioni generali sono migliori, grazie alla gestione di elementi ed eventi "donate" da AS3.
*:Con la nuova versione del linguaggio, anche la stesura delle classi è cambiata ed è stata introdotta la possibilità di inserire un valore di default dei parametri, direttamente sulla dichiarazione del costruttore, rendendo più agevole la gestione dei parametri "opzionali".
