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.