La sintassi dell'azione (o meglio della funzione globale) loadVariablesNum()
è la seguente:
loadVariablesNum( file, livello [,metodo] );
dove file
è il nome del file, completo di percorso, da caricare, e livello
è il livello di impilamento in cui caricarlo. Il terzo 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 semplicemente:
loadVariablesNum ( file, livello );
Ad esempio:
loadVariablesNum("cartella/file.txt", 0);
Quello 0
utilizzato come secondo parametro della funzione, indica che le variabili verranno caricate nella timeline principale del filmato principale. Per capire meglio, facciamo una piccola digressione.
.i livelli
Due o più filmati swf possono essere caricati gli uni sopra gli altri per vederne il contenuto in trasparenza, come avviene sovrapponendo dei fogli di acetato:
Questa sovrapposizione si chiama "impilamento", dato che viene costruita una "pila" di filmati. La pila inizia dal basso con un filmato detto "principale", e continua con una serie di filmati detti "secondari". Per distinguere i vari filmati nella pila si usa indicarne il livello, partendo da quello del filmato "principale": il livello 0.
Come si fa a caricare un filmato in un livello superiore a quello principale? Con l'azione (funzione globale) loadMovieNum
:
loadMovieNum("filmati/movie.swf", 1);
La cifra 1
utilizzata come secondo parametro, indica che il filmato "movie.swf", contenuto nella cartella "filmati", andrà posizionato nel primo livello di impilamento sopra il filmato principale. Scrivendo:
loadMovieNum("filmati/movie.swf",6);
il filmato viene caricato nel sesto livello di impilamento, lasciando vuoti i primi 5.
Quando vogliamo richiamare un filmato in un livello di impilamento tramite Actionscript, usiamo la sintassi _leveln
dove a n dobbiamo sostituire il numero del livello. Ad esempio, per avviare il filmato nel livello 5, scriveremo:
_level5.play();
Tornando al loadVariablesNum:
come dicevamo, la scrittura
loadVariablesNum("cartella/file.txt", 0);
indica che le variabili contenute nel file di testo verranno caricate nel livello 0. Ora, supponiamo di avere un filmato con dei campi di testo nella timeline principale, e di caricare un file di testo con la sintassi appena vista, e che tutto funzioni regolarmente.
Se carichiamo questo filmato su un livello di impilamento superiore allo 0, come quando lo carichiamo nel livello 1 sopra un filmato principale, la cosa non funziona più.
Questo perchè il loadVariablesNum carica le variabili nella timeline principale del filmato nel livello 0, mentre i campi di testo adesso sono nel livello 1.
Quindi, perchè la cosa riprenda a funzionare, dobbiamo modificare il comando perchè rispecchi la nuova posizione del filmato:
loadVariablesNum("cartella/file.txt", livelloDelFilmato);
nel caso dell'esempio:
loadVariablesNum("cartella/file.txt", 1);
Facciamo subito una prova. Creiamo un filmato (con Flash5 o MX, è indifferente), e sullo stage creiamo tre campi di testo, impostati con le variabili "nome", "cognome" e "prova".
In Flash 5
Pannello Text Options - Flash 5
In Flash MX
Pannello Properties - Flash MX
Nello stesso frame in cui sono presenti i tre campi di testo, inseriamo lo script:
loadVariablesNum("file.txt", 0);
prova = "nome: " + nome;
Infine, creiamo un file chiamato "file.txt" contenente il seguente testo:
nome=Mario&cognome=Rossi
Esportiamo, e questo è quello che otteniamo:
Molto probabilmente, vedremo i primi due campi di testo con inserite correttamente le due variabili importate dal file esterno, ma nel terzo campo vedremo solo la scritta "nome: ".
Questo perchè, come appena spiegato, non si può caricare un file di testo e supporre che le variabili siano subito cariche per essere utilizzate via script, mentre i campi di testo ce ne mostrano il contenuto appena questo diventa disponibile.
Per risolvere questo problema, facciamo le seguenti modifiche:
- cambiamo il file di testo aggiungendo una variabile "finta" alla fine
nome=Mario&cognome=Rossi&loaded=ok
- creiamo un filmato di 4 frame
- nel primo frame del filmato, scriviamo solo l'istruzione per il caricamento:
loadVariablesNum("file.txt", 0);
- nel secondo frame, lo script per controllare che l'ultima variabile del file di testo sia stata caricata:
- nel terzo frame, lo script per rimandare al frame precedente per un nuovo controllo
- nel quarto frame, inseriamo i tre campi di testo con lo script che utilizza una delle variabili:
- i campi di testo non sono delle variabili, e non contengono alcun valore: solo solo delle "finestre" attraverso le quali possiamo vedere il contenuto di una variabile alla quale il campo di testo è associato.
- il
loadVariablesNum()
funziona allo stesso modo in Flash 5 e Flash MX, ma per quest'ultimo è decisamente obsoleto, rimpiazzato e migliorato dal metodoLoad
dell'oggettoLoadVars
.
if(loaded == "ok"){
this.gotoAndStop(4);
}
this.gotoAndPlay(2);
prova = "nome: " + nome;
E questa volta ha funzionato. Cosa succede esattamente? Nel primo frame avviene il caricamento del file di testo: nel secondo, verifichiamo se è stata caricata l'ultima variabile. Se la variabile non è stata caricata, l'istruzione tra le graffe dell'if non viene eseguita, e la riproduzione continua al terzo frame, che rimanda la testina sul secondo frame. Abbiamo quindi un ciclo di controllo continuo tra il secondo e il terzo frame, fino a che la condizione non è verificata.
A questo punto, la riproduzione viene spostata e fermata al frame 4, dove vediamo le variabili nei campi di testo, e dove la variabile "nome" può correttamente essere utilizzata via script.
.flashMX
Con il FlashMX non è necessario questo tipo di loop, in quanto è possibile utilizzare l'evento onData
che viene scatenato al termine del caricamento. La sintassi in questo caso sarà:
_leveln.onData = function () {
// azioni da eseguire a caricamento completo
}
loadVariablesNum(nomefile, n);
e quindi, ad esempio:
_level0.onData = function ()
{
prova = "nome: " + nome;
}
loadVariablesNum ("file.txt", 0);