Il loadVariables
che ci interessa è un metodo della Classe MovieClip, e serve a caricare i dati esterni in un'istanza di quest'ultima invece che in un livello come per il loadVariablesNum
(e non va confuso con l'azione/funzione globale con lo stesso nome).
La sintassi del metodo è la seguente:
movieclip.loadVariables( file [,metodo] );
dove movieclip è il nome di istanza, completo di percorso, del movieclip nel quale caricare le variabili, e file è il nome, completo di percorso, del file da caricare. Il secondo parametro, che da adesso in poi non considereremo, serve nel caso dell'invio
di variabili, e ne indica il metodo HTTP, "GET" o "POST". Nel caso del solo caricamento è superfluo, quindi useremo emplicemente:
movieclip.loadVariables(file);
Ad esempio:
clip.loadVariables("cartella/file.txt");
Ora, l'utilità di una sintassi di questo tipo è relativa. Infatti, lo scopo principale dell'utilizzo di questo metodo è di poter utilizzare il gestore di eventi onData
per verificare il caricamento delle variabili senza creare un loop con i frame come abbiamo visto per il loadVariablesNum
.
Partiamo subito con un esempio:
- creiamo un file di testo, con scritto dentro:
nome=Mario&cognome=Rossi
- nella stessa cartella creiamo un nuovo filmato in Flash
- nel primo frame, creiamo un movieclip, con dentro tre campi di testo con associate le variabili "nome", "cognome", "prova"
- associamo al movieclip il seguente script:
onClipEvent(load){
this.loadVariables("file.txt");
prova = "nome: " + nome;
}
In questo caso, quando per la prima volta il movieclip viene instanziato (evento onLoad
), vengono eseguite le due righe di istruzioni, la prima delle quali carica il file di testo dentro il movieclip stesso, mentre la seconda cerca di utilizzare una delle variabili mediante Actionscript.
Esportiamo:
Come nel caso del loadVariablesNum
, vediamo i primi due campi di testo popolati correttamente, mentre il terzo no. Questo appunto perchè tra il caricamento del file e l'utilizzo delle variabili non è passato il tempo sufficiente.
Modifichiamo il filmato, solo cambiando qualche riga dello script associato al movieclip:
onClipEvent(load){
this.loadVariables"file.txt");
}
onClipEvent(data){
prova = "nome: " + nome;
}
Esportiamo:
Ora tutto funziona correttamente. Questo perchè abbiamo sottoposto il codice con cui creiamo la variabile "prova" all'evento onData
. Cosa significa? Significa che tutto quello che scriviamo al posto della parte in viola:
onClipEventdata){
// blocco di codice
}
viene eseguito solo quando tutte le variabili esterne sono state caricate. Il vantaggio di questo evento è chiarissimo: per controllare il caricamento non abbiamo bisogno di un loop di frame.
Arrivati a questo punto, abbiamo il totale controllo sulle fasi di caricamento, e possiamo anche creare un sistema che mostri una scritta di attesa. Ad esempio:
- spostiamo i tre campi di testo nel secondo frame del movieclip
- nel primo frame del movieclip inseriamo la scritta "loading"
- modifichiamo il codice associato:
onClipEvent(load){
this.stop();
this.loadVariables("file.txt");
}
onClipEvent(data){
this.nextFrame();
prova = "nome: " + nome;
}
Cosa succede: nel momento in cui il movieclip appare per la prima volta nella filmato, viene fermato nel primo frame, e viene caricato il file di testo. Quando e solo quando le variabili sono state caricate, il movieclip si sposta al frame seguente, dove sono presenti i tre campi di testo, e viene eseguito lo script che ce ne mostra il contenuto, anche tramite l'utilizzo di Actionscript.
// al caricamento del movieclip
onClipEvent (load){
// fermiamo la riproduzione nel primo frame
this.stop();
// carichiamo il file di testo
this.loadVariables("file.txt");
}
// al caricamento completo delle variabili
onClipEvent(data){
// spostiamo la riproduzione al frame seguente
this.nextFrame();
// creiamo la variabile "prova"
// utilizzando una delle variabili esterne
prova = "nome: " + nome;
}
Molto spesso, però, mi è stato chiesto come fare quando i campi di testo devono stare nella timeline principale. Se infatti li spostiamo lì, rimangono vuoti, dal momento che le variabili vengono caricate nel movieclip e non nella root.
La soluzione a questo problema è molto semplice: basta spostare, a caricamento completo, tutte le variabili sulla root. Questo si ottiene con un ciclo for...in
, che passa attraverso tutte le variabili della timeline indicata ed esegue le istruzioni comprese tra le parentesi graffe.
- spostiamo i tre campi di testo sulla root, e cancelliamo il contenuto del movieclip
- modifichiamo lo script:
onClipEvent(load){
this.loadVariables("file.txt");
}
onClipEvent(data){
for(var prop in this){
_root[prop] = this[prop];
}
_root.prova = "nome: " + nome;
}
Commentato:
// al caricamento del movieclip
onClipEvent(load){
// carica il file di testo
this.loadVariables("file.txt");
}
// a caricamento completo delle variabili
onClipEvent(data){
// cicla attraverso tutte le variabili:
// di volta in volta, assegna alla
// variabile il nome fittizio "prop"
for(var prop in this){
// facendo riferimento a "prop"
// creane una copia sulla root
_root[prop] = this[prop];
}
// agisci sulla singola variabile
// creando "prova" nella root
_root.prova = "nome: " + nome;
}
.a capo nel file di testo
Se per questioni di chiarezza abbiamo strutturato il file di testo in questo modo:
A capo nel file di testo
quando le variabili vengono caricate nel filmato, i rispettivi valori presentano al termine la sequenza "rn" (ovviamente indesiderata),
come possiamo verificare dal Debugger
Variabili nel Debugger
Per eliminare questa sequenza, a caricamento ultimato e prima di utilizzarle, "puliremo" le variabili, che vanno trattate come stringhe, tramite i metodi split
e join
.
Il metodo split
, data una sequenza di caratteri, spezza la stringa in porzioni prive della sequenza stessa, generando un array, mentre il metodo join
, data una nuova sequenza, unisce gli elementi dell'array restituendo una stringa.
Quindi, rivedendo gli ultimi due script:
onClipEvent(load){
this.stop();
this.loadVariables("file.txt");
}
onClipEvent(data){
this.nextFrame();
for(var prop in this){
this[prop] = prop.split("rn").join("");
}
prova = "nome: " + nome;
}
onClipEvent(load){
this.loadVariables("file.txt");
}
onClipEvent(data){
for(var prop in this){
_root[prop] = prop.split("rn").join("");
}
_root.prova = "nome: " + _root.nome;
}