Come faccio ad evitare l’attesa quando si deve vedere un oggetto presente nella libreria condivisa?

Utente HTML.it
chiede

Come faccio ad evitare l’attesa quando si deve vedere un oggetto presente nella libreria condivisa?

Redazione HTML.it
risponde

Come spiegato più diffusamente in questo articolo, quando nel filmato appare per la prima volta il riferimento ad un oggetto conentuto in una libreria condivisa, questa viene scaricata completamente, e secondo un ordine non pilotabile. Per questo motivo, sarà necessario attendere anche tutto il caricamento per poter vedere l’oggetto in questione, inconveniente decisamente da evitare.

Una soluzione al problema, è quella di precaricare la libreria condivisa durante il preloader del filmato principale. Se carichiamo la libreria sul livello 1, ad esempio, questa resterà invisibile (non c’è niente sullo stage), e sarà da subito disponibile nella cache alle successive richieste da parte sia del filmato principale, che degli altri filmati del progetto.

Supponendo quindi che il preloader del filmato principale sia impostato in un unico movieclip, avremo un codice di questo tipo:

onClipEvent (load) {
    _root.stop();
    main = true;

}
onClipEvent (enterFrame)
{
    if (main)
{
        car = _root.getBytesLoaded();
        tot = _root.getBytesTotal();

        if (car == tot) {
            loadMovieNum(“libreria.swf”, 1);
            main = false;
            libreria = true;
        }
    }
    if (libreria)
{
        car = _level1.getBytesLoaded();
        tot = _level1.getBytesTotal();
        if (car == tot && _root._url != _level1._url) {
              _root.gotoAndPlay(2);
        }
    }
}

Vediamo riga per riga:

// al caricamento del movieclip

onClipEvent (load)
{
     // ferma la riproduzione della timeline principale
    _root.stop();
     // setta come vera la variabile “main”, che permette
     // il preloader del filmato principale
    main = true;

}
// ad ogni riproduzione del movieclip
onClipEvent (enterFrame)

{
     // se la variabile
“main” è vera

    if (main)
{
         // controllo sui bytes caricati e totali
        car = _root.getBytesLoaded();
        tot = _root.getBytesTotal();
         // se il caricamento del filmato principale è completo
        if (car == tot) {
             // carica la libreria condivisa sul livello 1
            loadMovieNum(“libreria.swf”, 1);
             // setta “main” come falsa (fine caricamento principale)
            main = false;
             // setta la variabile “libreria” come vera (avviando il controllo)o
             // sul caricamento della libreria condivisa)
            libreria = true;
        }
    }
     // se la variabile “libreria” è vera
    if (libreria) {
         // controllo sui bytes caricati del livello 1 (dove c’è la libreria)
        car = _level1.getBytesLoaded();
        tot = _level1.getBytesTotal();
         // se “car” è uguale a “tot” e il percorso del filmato principale è
         // diverso da quello sul livello 1 (e quindi esiste un filmato sul
         // livello 1, altrimenti le variabili sarebbero undefined)
        if (car == tot && _root._url!= _level1._url) {
               // riavvia la riproduzione del filmato principale
              _root.gotoAndPlay(2);
        }
    }
}

Terminato il preloader, la libreria è sul livello 1. Adesso la possiamo tranquillamente scaricare con unloadMovieNum(1), o sostituire con un altro filmato, o lasciarla dov’è. La cosa è indifferente, dal momento che lo scopo principale, cioè caricarla nella cache prima della riproduzione, è raggiunto.