Ciao, vi espongo il problema che ho nel pubblicare un menu dinamico.
Al primo frame carico il file .txt esterno e faccio in modo che la vita riprenda a scorrere sulla timeline solo in seguito ad una verifica di effettivo caricamento:
stop();
var arts:LoadVars = new LoadVars();
//uso o uno o l'altro dei seguenti cicli if.
//(il secondo usa una variabile contenuta nel file esterno)
if (arts.getBytesLoaded()>=arts.getBytesTotal()) {
play();
}
if (arts.EOF == "true") {
gotoAndPlay(2);
}
arts.load("txts/arts.txt");
//oppure uso quest'altro sistema (mi sembra che vadano bene tutti):
if (arts.onLoad(success)) {
play();
}
arts.load("txts/arts.txt");
Al quidicesimo frame ho questo bello scriptone:
stop();
//in un campo di testo per solo scopo di verifica, tanto per avere conferma,
//faccio apparire il valore "true" del secondo ciclo di prima:
_root.verifica_txt.text=arts.EOF;
/* "inputVal" è il numero di voci complessive caricate (contenuto nell'oggetto LoadVars sul primo frame, che carica i dati);
"numeravoci" mi serve solo a numerare correttamente i duplicati del movieclip "square" (vedi oltre), ossia un singolo rettangolo con campo di testo, che verrà importato dalla libreria
"_root.items_txt" è solo un campo di testo che mi dirà, in base a "inputVal", quanti elementi avrà il menu
"numeravoci" è un espediente grafico: mi serve solo a generare un menu con il doppio di "square" rispetto alle voci "inputVal"
*/
_root.items_txt.text = "Arts. Items: "+arts.inputVal;
var allSquares:Number = arts.inputVal*2;
var numeravoci:Number = 0;
// posizione y del primo "square" attaccato
var pos:Number = 0;
// posizione y iniziale di "holder", ossia il clip in cui viene importato e duplicato "square".
// tale y di "holder", come vedete, è data da una variabile posta in "holder" stesso
//(non è importante per quanto riguarda il problema vero)
_root.holder._y = _root.holder.inizialeY;
// Maschero il "holder" con "maskholder", perché ne ho bisogno!
_root.holder.setMask(_root.maskholder);
/* Mi faccio una bella funzione, "doAttach()"
Questa funzione carica "square" sulla root per creare
uno "schedario" di voci, disposte ad elenco verticale;
ma dato che il numero di dati esterni varierà a seconda dei documenti a disposizione,
il ciclo "if" specifica che gli oggetti "square" ad assumere un nome o un
valore nel campo di testo saranno solo quelli corrispondenti
al numero di dati esterni. Scusatemi, forse mi spiego male
*/
function doAttach() {
for (i=0; i<allSquares; i++) {
_root.holder.attachMovie("square", "square"+i, i);
this.mc = _root.holder["square"+i];
this.mc._y = _root.pos;
_root.pos += 14;
numeravoci++;
if (numeravoci<=arts.inputVal) {
this.mc.titolovoce_txt.text = arts[numeravoci];
} else {
this.mc.titolovoce_txt.text = "–";
}
}
}
// ...E si mette in moto subito "doAttach()"
doAttach();
***
Adesso vi dico cosa succede.
Una volta messo in rete per prova, questo script agisce bene finché deve caricare le variabili nel flashmovie (la prova di ciò è l'avanzamento della testina sulla timeline: se le variabili non fossero caricate, non arriverei mai al frame 2 e di conseguenza al 15 dove continuo il lavoro).
Però, e qui forse si ferma la mia conoscenza di actionscript, se in versione locale riesco ad arrivare al frame 15 e a compiacermi dell'apparizione di un bel menu con tante belle voci prese dal file .txt esterno, nonché a visualizzare il testo "true" nel campo di testo di verifica, una volta portato in rete e provato con un browser, il menu non riesce ad essere generato.
Invece di usare "attachMovie" ho provato a ripensare il mio lavoro e a usare "duplicateMovieClip", ma non è cambiato nulla; ho poi creato un altro ciclo per dar tempo alla funzione "doAttach()" di lavorare, e pensavo di aver fatto una bella pensata. Niente anche stavolta.
Se qualcuno ha pazienza, se qualcuno può darmi suggerimenti, se qualcuno vuole che sia più chiaro, ne sarei grato.
Marcello

Rispondi quotando