This is a discussion on Metodo splice della classe Array within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Saaaaaaaaaalve !
Vi ricordate che abbiamo visto in questo tutorial quanto può essere importante un Array ?
Avete anche letto il tutorial ...
Vi ricordate che abbiamo visto in questo tutorial quanto può essere importante un Array ?
Avete anche letto il tutorial della sezione Actionscript base: gli Array ?
Se s', è giunto il tempo di vedere uno dei preziosi metodi che la classe Array di Actionscript 3.0 ci mette a disposizione.
Il metodo splice.
Questo metodo non fa altro che aggiungere o eliminare un elemento dall' array senza creare una copia dell' array stesso.
Supponiamo che vogliamo creare un banner a rotazione e devono girare dei banners pubblicitari dei nostri clienti.
Questo banner, carica un SWF esterno ogni tot secondi.
Dovrebbe farlo in modo casuale ma senza duplicati. Ne senso che ad ogni serie non deve ricaricare lo stesso SWF due volte.
Allora il metodo splice fa proprio al caso nostro...
Leggi tutto
Creo un FLA che salvo con nome ' main.fla '.
Creo la Document Class, un file AS che salvo con nome ' Main.as ', implementata in questo modo:
Code:
package
{
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class Main extends MovieClip
{
private var movies:Array;
private var timer:Timer;
public function Main()
{
initArray();
initTimer();
}
private function initArray():void
{
movies=new Array('swf_1','swf_2','swf_3','swf_4','swf_5','swf_6','swf_7','swf_8','swf_9','swf_10','swf_11','swf_12','swf_13','swf_14');
}
private function initTimer():void
{
timer=new Timer(50,movies.length);
timer.addEventListener(TimerEvent.TIMER,fishNumber);
timer.addEventListener(TimerEvent.TIMER_COMPLETE,finish);
timer.start();
}
private function fishNumber(evt:TimerEvent):void
{
var r:int=Math.floor(Math.random()*movies.length);
trace(movies[r]);
movies.splice(r,1);
}
private function finish(evt:TimerEvent):void
{
timer.reset();
trace('------------------------');
initArray();
initTimer();
}
}
}
Ecco il risultato dei trace:
Analizziamo il codice:
Proprietà
un array in cui inserisco i nomi degli SWF da caricare
private var movies:Array;
un timer
private var timer:Timer;
Funzione Costruttrice
chiamo il metodo initArray
initArray();
chiamo il metodo initTimer
initTimer();
Metodi
initArray();
popolo l' array
movies=new Array('swf_1','swf_2','swf_3','swf_4','swf_5','swf _6','swf_7','swf_8','swf_9','swf_10','swf_11','swf _12','swf_13','swf_14');
initTimer();
creo un nuovo timer, con velocità 300 ( è solo per questo esempio, naturalmente per un rotatore di banners basterebbe aumentare il valore per ottenere tempi più lunghi ) e come numero di volte la lunghezza dell' array
timer=new Timer(300,movies.length);
dico al timer di aggiungere un listener che chiamerà ogni 300 centesimi di secondo il metodo fishNumber
timer.addEventListener(TimerEvent.TIMER,fishNumber );
aggiungo un altro listener che mi avviserà quando il timer avrà completato le chiamate
timer.addEventListener(TimerEvent.TIMER_COMPLETE,f inish);
aziono il timer
timer.start();
fishNumber();
questo metodo viene chiamato ogni 300 centesimi di secondo
creo una variabile numerica alla quale assegno un valore casuale ( approssimato per difetto ) da zero alla lunghezza dell' array
var r:int=Math.floor(Math.random()*movies.length);
recupero l' elemento dell' array nell' indice pari al valore della variabile r
trace(movies[r]);
ecco lo splice! Dico a Flash di rimuovere dall' array l' elemento nell' indice r e di rimuovere solo lui ( se al posto di 1 avessi scritto 2, Flash toglierebbe 2 elementi: quello nell' indice r ed il precedente, se avessi scritto 3, Flash rimuove quello nell' indice r più i due precedenti...ma non è il nostro caso in quanto voglio eliminare solo l' elemento nell' indice pari al valore di r )
movies.splice(r,1);
finish();
questo metodo viene chiamato ogni volta che il timer ha finito un ciclo di chiamate ( pari alla lunghezza dell' array )
faccio un reset del timer
timer.reset();
eseguo un trace per ' spezzare ', in modo da capire quando il timer finisce un ciclo di chiamate
trace('------------------------');
richiamo il metodo initArray in modo da ripopolare l' array con i nomi degli SWF
initArray();
richiamo il metodo initTimer che ricomincerà un altro ciclo di chiamate
initTimer();
però facendo un trace(movies) dopo un ciclo ed avendo provato a scrivere movies.splice(r,2) invece che movies.splice(r,1), ho notato che toglie ll'elemento dopo, non quello precedente......