Eccoci ancora una volta ad affrontare un trucchetto che può servire a noi actionscripters incalliti.
Questa volta voglio trattare un argomento riguardante la chiamata di funzioni da un evento, le quali pretendono come parametro l' istanza dell' oggetto che ha dispacciato l' evento anche se volessimo chiamare la suddetta funzione senza lo scaturirsi di un evento.
E' poco piacevole e direi non ' educato ' dover riscrivere un' altra medesima funzione ma senza implementare quel parametro richiesto.
Questo ' problemino ' potrebbe capitare spesso utilizzando la
Classe Timer di Actionscript 3.0 oppure lavorando con
eventi del mouse.
Seguitemi ed entriamo in un esempio pratico...
Mettiamo il caso che stiamo utilizzando la classe Timer per richiamare una funzione ogni 5 secondi, in questo modo:
Code:
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.MouseEvent;
var id:int=0;
var timer:Timer=new Timer(5000,0);
timer.addEventListener(TimerEvent.TIMER,go);
timer.start();
function go(t:TimerEvent):void
{
id++;
trace(id);
}
Come possiamo vedere, quello script chiama la funzione go ogni secondi.
Però quando lanciamo l' swf non succede nullaper 5 secondi. Mettiamo che quella funzione go sia una funzione che chiama una immagine a rotazione ogni 5 secondi, alla pubblicazione dell' SWF avremmo un tempo morto appunto di 5 secondi, per cui di primo istinto ci verrebbe di chiamarla subito in modo che esegua il codice senza aspettare i 5 secondi di intervallo e poi il timer proseguirebbe nel suo cammino... ma ! non è così ! In quanto se noi aggiungiamo:
go() ;
subito prima di istanziare il timer, riceviamo un errore da Flash che dice che c'è un errato numerodi argomenti alla chiamata della funzione go, e in effetti la funzione go vuole una istanza della classe TimerEvent.
A questo punto suggerisco di fare in questo modo:
Code:
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.MouseEvent;
var id:int=0;
var fantasma:TimerEvent;
go(fantasma);
var timer:Timer=new Timer(5000,0);
timer.addEventListener(TimerEvent.TIMER,go);
timer.start();
function go(t:TimerEvent):void
{
id++;
trace(id);
}
Come vediamo,
ho creato un'istanza della Classe TimerEvent e senza inizializzarla l' ho passata alla funzione go.
Questo potrebbe accadere anche quando lavoriamo con funzioni che vengono chiamate dallo scaturirsi di un evento ( tipo MOUSE_DOWN della classe MouseEvent ) del mouse e necessitassimo di chiamare la stessa funzione anche senza lo scaturirsi di un evento.
Alla Prossima !