Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Preloader di un filmato esterno

Come precaricare un filmato esterno a quello principale
Come precaricare un filmato esterno a quello principale
Link copiato negli appunti

Prima di trattare l'argomento, faccio una piccola precisazione. Il preloader non è un una barra di avanzamento, o una casella di testo dinamico che mostra una percentuale. Il preloader è semplicemente un trucco per impedire la riproduzione di un filmato PRIMA che questo sia caricato completamente, onde evitarne comportamenti imprevisti.

Tutte le altre cose appunto, barre, percentuali, movieclip, scritte, sono solo un contorno grafico, che può o non può esserci: la loro funzione è unicamente quella di distrarre l'utente durante l'attesa.

Il che significa che un preloader può essere inserito in qualunque filmato, qualunque siano le sue dimensioni, senza appesantirle ulteriormente, se non in maniera irrilevante. In sintesi, il preloader non fa mai male.

In Flash 5, un preloader può essere fatto semplicemente così: si inserisce nel primo frame del filmato un movieclip vuoto, al quale si associa:

onClipEvent(load){
   _root.stop();
}
onClipEvent(enterFrame){
   if(_root.getBytesLoaded() == _root.getBytesTotal()){
      _root.play();
   }
}

e nulla di più.

Questo metodo ferma il filmato, e attende il caricamento completo prima di farlo ripartire, controllando ciclicamente se il numero dei bytes caricati è uguale al numero dei bytes totali.

Inserendo questo codice nel primo frame di un filmato, che poi verrà caricato sul livello 1 da un filmato principale, il preloader funzionerà ugualmente, perché farà riferimento al filmato in cui è inserito.

Facciamo un esempio. Ho un filmato principale, con un pulsante. Alla pressione del pulsante, voglio che venga caricato il filmato movie.swf sul livello 1, e che questo abbia un preloader. Mi basterà inserire nel filmato movie.swf un preloader qualsiasi (in cui i riferimenti siano però a _root, e non a _level0).

Quando il pulsante verrà premuto, il filmato verrà caricato sul livello1. Inizierà il ciclo di controllo del preloader, e si vedrà sopra il filmato principale la grafica del preloader del filmato secondario: effetto tutt'altro che sgradevole, grazie alla trasparenza dello sfondo.

Fino a qui, niente di particolare. Ogni filmato ha il proprio preloader, totalmente indipendente dagli altri.

Supponiamo però di voler usare l'attachSound. Il Flash, all'esportazione di un filmato, inserisce gli oggetti linkati (per intenderci, quelli esportati come simbolo per essere utilizzati con l'attachSound, l'attachMovieClip o le librerie condivise), in un frame 0 fittizio all'inizio del filmato.

In questo modo, gli oggetti linkati devono essere tutti completamente caricati prima che si possa vedere il preloader, che sta invece nel frame 1: a quel punto, spesso non ha più alcun senso.

Per ovviare il problema, si ricorre all'uso di un filmato esterno, nel quale inserire il suono. Consideriamo quindi di voler utilizzare l'attachSound per inserire al filmato un sottofondo musicale.

Creeremo un filmato con all'interno solamente il suono, esportato come simbolo nella libreria, con l'identificatore "suono". Nel primo frame del filmato inseriamo:

musica = new Sound(_root);
musica.attachSound("suono");

in questo modo inizializziamo il suono di sottofondo. Esportiamo con il nome "suono.swf". Il filmato non può avere un preloader proprio, quindi inseriremo quest'ultimo in quello sul quale verrà caricato. Nel filmato principale, inseriamo un movieclip, cui associamo:

// al caricamento del movieclip
onClipEvent(load){
// ferma la riproduzione del filmato principale
_root.stop();
// carica il filmato contenente il suono sul livello1
loadMovieNum("suono.swf", 1);
}
// ciclicamente, ad ogni riproduzione del movieclip
onClipEvent(enterFrame){
   // assegna a "car" il valore dei bytes caricati del livello1
   car = _level1.getBytesLoaded();
   // assegna a "tot" il valore dei bytes totali del livello1
   tot = _level1.getBytesTotal();
// se il valore di "car" è definito
   if(car != undefined){
      if(car == tot){
         // fai partire il suono presente nel livello 1
         _level1.musica.start(0,99);
         // riprendi l'esecuzione del filmato principale
         _root.play();
      }
   }
}

Con questo sistema, abbiamo bloccato il filmato principale, e atteso il caricamento del filmato esterno per far partire la musica di sottofondo. Il controllo con l'if(car != undefined), serve ad ovviare un problema che può verificarsi: quando viene caricato un filmato, c'è un intervallo di tempo, più o meno lungo, prima che sia possibile stabilirne le dimensioni. In quella frazione di secondo, "car" e "tot" sono entrambi non definiti, e per questo motivo, uguali. Quindi il movieclip cercherebbe di attivare il suono, anche se questo non è caricato.

Naturalmente, nel preloader, possono essere indicate anche altri comandi da eseguire a filmato caricato, così come i comandi per dare una visibilità grafica al processo.

Questo è il senso generale del preloader di un filmato esterno. Adesso vediamo come costruire un preloader che controlli il caricamento di entrambi i filmati. L'esempio è semplicissimo, l'approfondimento grafico è affidato al singolo utilizzatore.

Nel primo frame del filmato principale inseriamo un movieclip vuoto, al quale associamo:

// al caricamento del movieclip
onClipEvent (load) {
   // ferma la riproduzione del filmato principale
   _root.stop();
   // setta la variabile "main" come true
   main = true;
}
// ogni volta che il movieclip viene riprodotto
onClipEvent (enterFrame) {
   // se "main" è vera (e lo è)
   if (main) {
      // assegna a "car" e "tot" il valore dei bytes
      //
caricati e totali del filmato principale
      car = _root.getBytesLoaded();
      tot = _root.getBytesTotal();
      // se il filmato principale è caricato
      if (car == tot) {
         // carica sul livello 1 suono.swf (con l'attachSound)
         loadMovieNum ("suono.swf", 1);
         main = false; // setta "main" come false
         suono = true; // setta "suono" come true
      }
   }
   if (suono) {
      // se "suono" è su true (filmato principale caricato)
      
// calcola i valori di "car" e "tot" riferiti al livello 1      
    car = _level1.getBytesLoaded();
      tot = _level1.getBytesTotal();
      // se "car" è definito
      if(car != undefined){
         // se il valore di "car" è diverso da quello di "tot"
         if(car == tot){
            // fai partire il suono presente nel livello 1
            _level1.musica.start(0,99);
            // riprendi l'esecuzione del filmato principale
            _root.play();
         }
      }
   }
}

Ti consigliamo anche