Ciao a tutti !
Proseguo con i tutorials delle basi di Actionscript 3.0 .
Dopo aver visto
come si usano e cosa sono le varibili, entriamo nel mondo degli Array.
Prima di incominciare voglio sottolineare il fatto che gli Array possono essere estremamente complessi ed avere svariati metodi e tecniche su come implementarli e su come gestirli.
Se dovessi spiegare gli Array di Actionscript 3.0 in tutto e per tutto, non basterebbero 30 pagine e rischierei di creare molta confusione al target delle persone che leggono questi tutorials ( la maggior parte alle prime armi e principianti ).
In questo tutorial rimaniamo nelle prime basi, per cui Array ad una sola dimensione con accenni ad un Array bi-dimensionale.
Vedremo come dichiarare un Array e come popolare ( riempire ) un Array.
Se vi ricordate, avevo chiesto ( a chi si avvicina per la prima volta alla programmazione e in questo caso ad Actionscript ) di pensare ad una variabile come ad una scatola.
Una scatola che ha un nome e che contiene un valore. Basta chiamare il nome della scatola per recuperare il valore che contiene.
Un Array è solo una scatola più grande...
Classe Array
Un Array è una scatolone che può contenere altre scatole al suo interno.
Questo dovrebbe farvi capire che un Array in Actionscript 3.0 può contenere delle variabili che a loro volta contengono un valore.
Dichiaro un Array:
var nomi:Array=new Array();
in questo caso ho dichiarato una varibile di tipo Array ( quindi che può contenere altre variabili ) e al momento è vuoto.
Infatti se proviamo a dire a Flash: trace(nomi); si apre il pannello output ma Flash non ci scrive niente.
Come popolarlo ?
Ci sono diversi modi, il primo sicuramente da tenere in considerazione e da imparare è il seguente:
nomi=['filippo','luca','giovanni','giacomo','pietro'];
tra parentesi quadre inseriamo dei valori stringa ( String ) separati da una virgola.
Se eseguiamo un trace(nomi); ecco l' output che otteniamo da Flash:
filippo,luca,giovanni,giacomo,pietro
Un altro modo, è di popolare il nostro Array al momento della dichiarazione:
var nomi:Array=new Array('filippo','luca','giovanni','giacomo','pietr o');
in questo caso abbiamo inserito i valori stringa all' interno delle parentesi tonde al momento in cui abbiamo dichiarato l' Array.
Il risultato è idenico all' esempio pecedente, infatti con il comando trace( nomi); otteniamo lo steso output:
filippo,luca,giovanni,giacomo,pietro
Ok, e adesso ?
Risposta:
Flash ha creato una variabile che al suo interno contiene altre variabili con dei valori stringa ( 'filippo', 'luca', ' giovanni' ecc ecc ):
Allo stesso tempo che abbiamo popolato l' Array, Flash ha assegnato un indice ad ogni valore. Un indice che sarebbe il nome di ogni scatola, di ogni variabile contenuta al suo interno.
Gli indici che gli assegna sono numerici e vengono incrementati partendo dallo zero.
Ad esempio, se io scrivo: nomi[0]; è come scrivere 'filippo', in quanto Flash va a recuperare il valore che è all' interno dell' Array nomi all' indice 0 ( zero ), il primo indice.
Se scrivo nomi[3] è esattamente come se scrivessi 'giacomo', perchè Flash prende il valore nell' indice 3 dell' Array nomi.
Quindi, ecco come recuperare i valori all' interno dell' Array:
trace(nomi[0]); ottengo:
filippo
trace(nomi[1]); ottengo:
luca
trace(nomi[2]); ottengo:
giovanni
trace(nomi[3]); ottengo:
giacomo
trace(nomi[4]); ottengo:
pietro
Per togliere ogni dubbio e fare un altro esempio concreto, potremmo anche dichiarare e popolare un Array in questo modo:
var nomi:Array=new Array();
nomi[0]='filippo';
nomi[1]='luca';
nomi[2]='giovanni';
nomi[3]='giacomo';
nomi[4]='pietro';
infatti, se scrivo trace(nomi); ottengo sempre il solito output:
filippo,luca,giovanni,giacomo,pietro
Se scrivo:
var nomi:Array=new Array('filippo','luca','giovanni','giacomo','pietr o');
e poi
nomi[1]='cesare';
con trace(nomi); ottengo:
filippo,cesare,giovanni,giacomo,pietro
Chiaramente, se dovessi scrivere:
trace(nomi[5]);
otterrei
undefined
in quanto l' indice 5 nell' Array non esiste perchè abbiamo sì 5 indici ma partendo dallo zero ( quindi: 0,1,2,3,4 ).
Proprietà length della classe Array
Dall' ultimo esempio mi collego ad una proprietà della Classe Array che mi restituisce/dice la lunghezza dell' array:la proprietà length.
Se scrivo:
trace(nomi.length);
ottengo
5
quindi, per recuperare l' ultimo valore dell' Array potrei scrivere:
trace(nomi[nomi.length-1]);
ottenendo
pietro
nomi.length-1 e ho la certezza assoluta di riferirmi all' ultimo indice dell' Array, cioè la sua lunghezza meno uno.
Questa proprietà sarà fondamentale quando la prossima volta vedremo come ' navigare ' gli Array utilizzando un ciclo.
Metodo push della Classe Array
Un metodo semplice ma molto importante è push.
Come la parola stessa lascia inendere, inserisce un valore nell' array.
quindi, se ad esempio scrivo:
var nomi:Array=new Array('filippo','luca','giovanni','giacomo','pietr o');
nomi.push('antonio');
Flash inserisce il valore che passo a push creando un nuovo indice. Lo inserisce alla fine dell' Array, non all' inizio.
Quindi con trace(nomi); ottengo:
filippo,luca,giovanni,giacomo,pietro,antonio
Il nostro Array adesso ha lunghezza 6, infatti con trace(nomi.length); ottengo
6
Metodo reverse della classe Array
Questo metodo, anche in questo il nome lascia intendere benissimo, inverte il contenuto del nostro Array.
Se scrivo
var nomi:Array=new Array('filippo','luca','giovanni','giacomo','pietr o');
nomi.reverse();
con trace(nomi); ottengo
pietro,giacomo,giovanni,luca,filippo
e quindi nomi[0] sarà pietro
Come ho già detto esistono tanti altri metodi e tante altre proprietà della classe Array, ma direi di fermarci quì.
Potrete voi stessi studiare gli altri metodi, dato che questo tutorial dovrebbe avervi dato le basi necessarie per capire a fondo la classe Array di Actionscript 3.0 .
Fino ad ora abbiamo visto come lavorare con un Array che contiene dei valori stringa ma tengo a precisare che un Array può contenere qualsiasi tipo di valore: Number, textField, MovieClip, ecc ecc...
Facciamo un esempio con Array e MovieClip.
Creo un FLA che salvo con nome ' main.fla '.
Creo un livello in più, in modo da averne due.
Ad un livello assegno il nome clips e all' altro il nome code ( oppure actions )
Al suo interno, creo una MovieClip e gli assegno il nome mc_clip.
Trascino 5 volte la MovieClip dalla libreria allo stage sul livello clips, creando 5 istanze della stessa MovieClip e gli assegno i corrispoettivi nomi istanza: clip_0_mc, clip_1_mc, clip_2_mc, clip_3_mc, clip_4_mc.
Seleziono il livello clips, apro il pannello azioni e scrivo:
var clips:Array=new Array(clip_0_mc,clip_1_mc,clip_2_mc,clip_3_mc,clip _4_mc);
in questo caso, ho creato un Array con nome clips e gli ho inserito le 5 MovieClip che sullo stage ( chiaramente inserendole col loro nome istanza ).
Se eseguo trace(clips); ottengo
[object MovieClip],[object MovieClip],[object MovieClip],[object MovieClip],[object MovieClip]
Flash mi sta dicendo che dentro a clips ci sono 5 MovieClip.
Ora, se scrivo
clips[0].alpha=0.5;
quando pubblico l' SWF noto che una delle 5 MovieClip è più trasparente delle altre.
Se avete ben chiaro cosa è un Array dagli esempi precedenti, non è difficile capire il perchè.
clips[0] è clip_0_mc
.alpha=0.5; cambio il valore della proprietà alpha di quella MovieClip a 0.5 ( va da 0 a 1 ).
Se scrivo
clips[3].rotation=45;
noterò che la MovieClip che è contenuta nell' indice 3 dell' ARray clips ha girato su se stessa di 45° in quanto ho agito sulla sua proprietà rotation.
Files: