Prima di tutto riporto lo script perchè ho dovuto correggere qualche piccolo bug:
Codice PHP:
// utilizzo una funzione (è sempre comodo avere una funzione da poter richiamare in qualsiasi momento)
function disponi() {
// Dichiaro le variabili generali (è meglio abituarsi a farlo in previsione di un futuro passaggio ad AS3)
var clip:MovieClip, i:Number, o:Number;
// Definisco le caratteristiche della griglia (potrei usare delle singole variabili ma un oggetto ha una maggiore scalabilità).
var griglia:Object = {larghezza:550, altezza:350, colonne:3, righe:3};
// Creo un array per degli oggetti.
// Per identificare la serie degli oggetti da disporre sullo stage utilizzo un array
// supponendo che questi oggetti siano già presenti sullo stage.
// E' possibile comunque studiare e usare un qualsiasi altro sistema.
var oggetti:Array = [clip1, clip2, clip3, clip4, clip5];
// Deduco gli altri attributi della griglia in base alle caratteristiche definite sopra
griglia['totaleCelle'] = griglia.colonne*griglia.righe;
griglia['cella'] = {larghezza:griglia.larghezza/griglia.colonne, altezza:griglia.altezza/griglia.righe};
griglia['indici'] = new Array();
// Creo l'array di indici della griglia popolando ogni elemento secondo una normale serie numerica.
for (i=0; i<griglia.totaleCelle; i++) {
griglia.indici[i] = i;
}
// Eseguo un ciclo degli oggetti e li posiziono secondo l'ordine casuale
// ottenuto prendendo a random gli elementi dell'array griglia.
for (o in oggetti) {
// Riferimento al clip corrente preso dalla sequenza degli oggetti.
clip = oggetti[o];
// Pesco un indice casuale ed elimino questo elemento dall'array in modo da non poterlo ripescare.
i = griglia.indici.splice(Math.random()*griglia.indici.length, 1)[0];
// Posiziono il clip dentro la cella a cui si riferisce l'indice casuale.
// Il clip viene inoltre posizionato casualmente all'interno della cella considerando la dimensione della cella e l'ingombro del clip.
clip._x = (i%griglia.colonne)*griglia.cella.larghezza+Math.random()*(griglia.cella.larghezza-clip._width);
clip._y = Math.floor(i/griglia.colonne)*griglia.cella.altezza+Math.random()*(griglia.cella.altezza-clip._height);
}
}
// richiamo la funzione per disporre gli oggetti sullo stage
disponi();
da un primo sguardo mi sembra tutto abbastanza chiaro, a parte il fatto ke nn ho mai usato scrivere una funzione per poi richiamarla successivamente...ma diciamo ke questa parte riuscirò a capirla!!
Ho usato una funzione essenzialmente per due motivi, anzi tre:
Praticità nell'utilizzo dello script.
Una funzione ovviamente può essere richiamata da qualunque parte del tuo filmato e può essere richiamata anche più volte e in diverse circostanze. Ad esempio puoi richiamarla al click su un pulsante semplicemente associando tale funzione all'evento onRelease. Nel caso specifico non ha particolarmente senso ma è sempre meglio "predisporre" il tutto per un uso generalizzato.
Identificazione di un'area di validità ben distinta.
Una funzione ha una sua certa area di validità in cui tutte le variabili dichiarate al suo interno nascono, vivono e muoiono sempre e solo all'interno di tale funzione. Questo permette di avere una maggiore pulizia nell'uso delle variabili. Permette inoltre di avere più "istanze" della stessa funzione che mantengono ognuna la validità delle proprie variabili evitando possibili sovrascritture delle variabili stesse.
Ad ogni modo è meglio evitare di disseminare variabili qua e là sulla root. In determinati casi questo può infatti essere utile per il risparmio di risorse perché si evita di mantenere in memoria delle variabili non più utilizzate dopo che la funzione ha fatto il suo dovere. Ovviamente bisogna tenere conto che la funzione stessa è una variabile tenuta in memoria (ma che volendo la si può eliminare in un sol colpo).
Maggiore scalabilità e riutilizzo dello script.
Una funzione può essere implementata facilmente per un utilizzo generalizzato. Supponi ad esempio di voler disporre, nello stesso filmato, diversi gruppi di clip in diverse griglie.. basterà in questo caso impostare la stessa funzione con dei parametri ed utilizzare sempre lo stesso script evitando quindi di ripetere blocchi di script simili.
altra cosa a me ignota è sulle ultime due righe, quelle riferite alla posizione x e y dei movieclip: il simbolo % nn so cos'è, così come il comando int...
Questo simbolo "%" è detto "operatore modulo", in sostanza calcola il resto di una divisione tra due numeri.
Applicato al nostro script non fa altro che restituirci il valore della colonna.
codice:
(i%griglia.colonne)
Tenendo presente che la variabile "i" rappresenta l'indice casuale di una cella che, nel caso specifico, ha un valore compreso tra 0 e 8 (data la griglia 3x3).
Dividendo questo indice per il numero di colonne della griglia (griglia.colonne) otteniamo, come resto, il valore esatto della colonna in cui ricade la cella riferita a tale indice.
Mentre la funzione "int" (che risulta essere obsoleta per cui l'ho sostituita con l'analogo metodo floor della classe Math) restituisce il valore intero di un numero (eliminando quindi la parte decimale nel caso ci si ritrovi con un numero decimale).
Applicato al nostro script non fa altro che restituirci il valore della riga.
codice:
Math.floor(i/griglia.colonne)
Dividendo l'indice "i" per il numero di colonne della griglia (non di righe come ho indicato erroneamente nello script iniziale), e prendendo la parte intera, otteniamo il valore esatto della riga in cui ricade la cella riferita a tale indice.
Ecco perché ho scritto:
adoperando piuttosto un unico ciclo (per la serie di clip) in cui identifichi l'indice dell'array (cioè delle celle).
Da questo indice si potranno poi ottenere il numero di riga e quello di colonna per poi ricavarne le coordinate in cui posizionare ogni clip.
Questi valori (relativi a colonna e riga della cella) sono poi moltiplicati per le rispettive dimensioni della cella così da ottenere dei valori che corrispondono alle coordinate dell'angolo superiore-sinistro della cella in questione.
codice:
(i%griglia.colonne)*griglia.cella.larghezza;
Math.floor(i/griglia.colonne)*griglia.cella.altezza
Qui va specificato che bisognerà adottare una convenzione affinché il sistemi di riferimenti tra griglia e clip sia compatibile.
Infatti ho ipotizzato che il punto di registrazione di ogni clip sia riferito all'angolo superiore-sinistro (così come è solitamente).
L'ultimo passaggio è quello di randomizzare la posizione del clip all'interno della cella.
Non ho fatto altro che calcolarmi lo spazio utile rimanente nella cella, rispettivamente per la larghezza (griglia.cella.larghezza-clip._width) e per l'altezza (griglia.cella.altezza-clip._height), e quindi moltiplicarlo per un numero casuale.
codice:
clip._x = (i%griglia.colonne)*griglia.cella.larghezza+Math.random()*(griglia.cella.larghezza-clip._width);
clip._y = Math.floor(i/griglia.colonne)*griglia.cella.altezza+Math.random()*(griglia.cella.altezza-clip._height);
Mi scuso per la lunga esposizione, spero sia tutto chiaro.
Buono studio.