Quello delle librerie condivise è un concetto abbastanza complesso. Non tanto per la difficoltà di comprenderne il funzionamento, abbastanza intuitivo, ma perché è necessaria una conoscenza più approfondita di altre tecniche per renderne efficace l'utilizzo, anche a fronte di alcune imprecisioni dal punto di vista realizzativo da parte della Macromedia.
Funzionamento
Partiamo dal concetto delle istanze di uno stesso simbolo presente nella libreria di un filmato.
Utilizzando più volte lo stesso simbolo, si ha un risparmio nelle dimensioni del filmato, poichè l'oggetto è definito nella grafica o nel codice una sola volta, e poi se ne registrano, per le diverse istanze, solamente le proprietà.
Nelle librerie condivise, il concetto è lo stesso. Solo che la libreria è un filmato a se stante, e nei filmati vengono usati riferimenti agli oggetti presenti in esso.
Supponiamo di avere il nostro sito composto da un filmato principale, e da più filmati esterni da caricare sopra il primo a seconda delle sezioni esplorate. In tutti questi filmati ci sono degli oggetti comuni: un pulsante, oppure dei suoni, o un'immagine, o un movieclip. Definendo gli stessi oggetti, ognuno nel proprio filmato, otterremmo dei filmati nel cui peso in bytes è compreso lo stesso oggetto. Ogni volta che dovremo scaricare un filmato, per visualizzarlo dovremo attendere, nel caricamento complessivo, anche quello di oggetti che in via teorica sono già presenti nella cache del browser.
Le librerie condivise servono ad evitare questo spreco. In un filmato a parte, esiste solo il movieclip. In tutti gli altri filmati, esiste un riferimento a questo movieclip. Quindi l'oggetto non è presente fisicamente in tutti i filmati, e una volta scaricata la "libreria", facendo riferimento al movieclip contenuto in esso, visualizzerò correttamente tutti gli altri. Solo che questi avranno il peso del movieclip in meno.
Esempio pratico: filmato "A", che contiene solamente il movieclip, e che funge da libreria condivisa, filmati "B" e "C" che contengono un riferimento al movieclip presente nel filmato "A". Accedo alla sezione "B" del sito, e scarico il relativo filmato. Quando, nell'esecuzione di quest'ultimo, arrivo al punto in cui è presente il riferimento al movieclip in questione, inizia lo scaricamento del filmato "libreria". Prendendo le informazioni da quest'ultima, nel filmato "B" vedrò il movieclip richiesto. Accedo alla sezione "C" del sito, e scarico il filmato relativo: arrivo al punto in cui è presente il riferimento al movieclip. A questo punto si vede il vantaggio: non ho più bisogno di scaricare il filmato "A", perché è già presente nella cache. E ho risparmiato tempo e peso. Se il movieclip pesasse appunto 10k, e avessi 10 filmati che lo utilizzano, con una libreria condivisa risparmierei 90k, e il relativo tempo di scaricamento.
Definizione
Vogliamo creare una libreria condivisa. Innanzi tutto costruiamo all'interno del filmato l'oggetto che andrà utilizzato dai filmati esterni, e convertiamolo in simbolo, in modo che sia presente nella libreria. Non è necessario che l'oggetto sia presente anche sullo stage.
Accediamo ad ogni singolo oggetto nella libreria, con il tasto destro. Scegliamo "Concatenamento" (Linkage)
nel pannello che si apre, scegliamo "Esporta questo simbolo" (Export this symbol), e nel campo "Identificatore" (Identifier), scriviamo un nome che identificherà l'oggetto.
A questo punto possiamo salvare il filmato libreria, ed esportarlo in swf (vedremo dopo perchè). Apriamo il filmato in cui dobbiamo utilizzare l'elemento della libreria condivisa. Andiamo al menu File/Apri come libreria condivisa, e scegliamo il .fla della libreria. Si aprirà un pannello del tutto simile a quello delle librerie comuni di flash, con il fondo grigio. Trasciniamo l'oggetto dalla libreria allo stage del filmato. Salviamo il .fla.
Se adesso andiamo nel pannello libreria, e guardiamo le proprietà di concatenamento dell'oggetto, vedremo il pannello fatto così:
Quello che leggiamo, è che l'oggetto (in questo caso il logo di Flash5.it) ha appunto come identificatore il nome che gli avevamo dato nel filmato "libreria". La differenza sta nel fatto che si può vedere come il movieclip venga in realtà importato dal filmato libreria.swf.
Per questo è necessario esportare la libreria condivisa come swf, perchè va uploadata nel server assiema agli altri filmati:da questa infatti vengono prese le informazioni relative agli oggetti concatenati. Naturalmente vale anche in questo caso il discorso dei percorsi relativi. Secondo l'esempio della figura, il filmato libreria.swf dovrà risiedere nella stessa cartella dei filmati esterni che ne fanno uso. Se invece dobbiamo mettere libreria.swf nella cartella Files, ad esempio, quando i filmati sono già stati creati ed esportati, basterà scrivere nel campo "Importa questo simbolo dall'URL:" (Import this symbol from URL) il percorso della libreria. In questo caso, Files/libreria.swf
Quando durante la riproduzione del filmato, si arriverà al punto in cui è necessario l'utilizzo del logo, verrà caricato interamente il filmato libreria.swf
Lo stesso procedimento si utilizza per tutti gli oggetti, per i movieclip, i simboli grafici, i suoni, i pulsanti. Leggermente diverso è il procedimento per le Font.
Font
Come è noto, l'incorporamento dei caratteri comporta un aumento, talvolta molto importante, del peso di un filmato. Per cui anche le Font, come gli altri oggetti, possono essere utilizzate nelle librerie condivise.
Apriamo il pannello libreria, e clicchiamo il pulsante in alto a destra con la scritta "Opzioni" (Opzioni). Dal menu contestuale scegliamo "Nuovo Carattere" (New Font).
Nel pannello appena aperto, scriviamo un identificatore per la Font, ad esempio "testo", nel campo Nome (Name). Dal menu "Carattere" (Font) scegliamo la Font che desideriamo condividere (in questo caso, l'Arial) e poi scegliamo cliccando la relativa casella quale stile aggiungere, nell'esempio il grassetto (Bold). Premiamo il tasto ok.
Il pannello libreria, all'interno del filmato "libreria", apparirà così:
A questo punto accediamo al menu Concatenamento del simbolo del carattere, scegliamo "Esporta questo simbolo", e inseriamo l'Identificatore, in questo caso sempre "testo". Salviamo ed esportiamo.
Come per gli altri oggetti, apriamo il documento in cui dobbiamo utilizzare la Font condivisa. Andiamo al menu File/Apri come libreria condivisa, e selezionamo il fla della libreria. Trasciniamo il carattere da una libreria all'altra.
Adesso possiamo creare la casella di testo, e al momento di scegliere la Font, nella lista del pannello "Carattere", troveremo il nome usato come Identificatore per la Font, seguito da un asterisco.
Salviamo ed esportiamo.
Caratteristiche
Come dicevo all'inizio, per un corretto funzionamento delle librerie condivise, sono necessari alcuni accorgimenti. E prima di tutto bisogna considerarne le caratteristiche relative al funzionamento.
Quando, durante la riproduzione di un filmato, si arriva al punto in cui è presente il riferimento all'oggetto contenuto nel filmato "libreria", la riproduzione verrà interrotta fino a che non è stato scaricato. Questo verrà scaricato interamente, indipendentemente dalle dimensioni del singolo oggetto utilizzato, e dalla presenza o meno, all'interno del filmato, di altri oggetti definiti nella libreria condivisa. Dal momento che gli oggetti, nella libreria condivisa, hanno la stessa importanza al momento dello scaricamento, è evidente che se la libreria ha un peso consistente (sono presenti molti oggetti), il tempo di attesa potrebbe essere molto lungo, creando problemi nella corretta visualizzazione del filmato principale.
Quindi è preferibile utilizzare più librerie condivise contenenti pochi oggetti, e di dimensioni ridotte. Altrimenti, con la tecnica del preloader di un filmato esterno, se ne può comprendere il caricamento in quello del filmato principale, su un livello qualsiasi.
Ad esempio, si può caricare la libreria condivisa sul livello 100 durante il preloader. Dal momento che la libreria non ha oggetti sullo stage, sarà invisibile, ma presente costantemente nella cache, e il riferimento ad un oggetto concatenato avrà risposta immediata.
Bisogna inoltre considerare che finchè la libreria non è stata scaricata, il filmato in cui ne è previsto un riferimento non riprende la riproduzione. Nella deprecabile eventualità quindi la libreria non si caricasse, il filmato non potrebbe riprendere: ne consegue che è necessaria una accurata fase di test durante la progettazione, sia in locale che in rete, per verificarne il funzionamento.
Annotazioni importanti
- Un oggetto importato da una libreria condivisa non può più essere modificato, nel filmato in cui se ne utilizza il riferimento. In caso contrario, l'oggetto non sarà più condiviso, ma farà parte del filmato in questione.
- Una volta modificato un oggetto nel filmato che funge da libreria, l'oggetto non verrà aggiornato nei filmati che ne utilizzano il riferimento. Sarà necessario, in questi filmati, cancellare dalla libreria il vecchio oggetto, e importare quello aggiornato.
- Nel caso un oggetto sia annidato in un altro, perchè siano importati entrambi, bisognerà concatenarli singolarmente, e singolarmente importarli nel filmato che ne utilizza il riferimento. Evidentemente, mancando anche un singolo componente di un oggetto composto da altri oggetti annidati, il funzionamento ne sarà compromesso. Contrariamente a quanto succede con le comuni librerie in fase di progettazione, infatti, il trascinamento dell'oggetto principale da un filmato all'altro non comporta anche quello degli oggetti in esso annidati.
- Con un oggetto definito in una libreria condivisa, nel filmato in cui ne è contenuto il riferimento, non si possono utilizzare ne l'attachSound ne l'attachMovie.
Infatti questi due metodi prevedono l'utilizzo, oltre che dell'Identificatore, di un particolare ID non trasmissibile da un filmato all'altro. Quando si utilizza uno dei due metodi, il lettore ricerca, nella libreria del filmato in cui viene utilizzato, l'ID che identifica il suono o il movieclip. Ma dal momento che questo ID è invece presente nella libreria condivisa, e non nel filmato principale, il metodo non avrà risultato.
- Al momento attuale, le Font condivise possono essere utilizzate solo nei campi di testo statici. Utilizzate incorporate nei campi di testo dinamici, non saranno visualizzate in alcun modo.
- Agli oggetti importati da una libreria condivisa, non possono essere associati script di alcun tipo. Se ad esempio utilizzo in un filmato un pulsante definito in una libreria condivisa, a questo pulsante, in fase di progettazione, potrò associare qualunque azione: al momento della riproduzione, però, lo script non avrà alcun effetto, come se non fosse presente del tutto. Lo script dovrà quindi essere inserito già nella libreria condivisa, prima dell'esportazione. D'altronde, visto che gli script associati esternamente ad un oggetto non vengono considerati, sarà necessario annidare l'oggetto in un altro (un movieclip), concatenare entrambi, e importarli entrambi nel filmato principale.
Ad esempio, ho la necessità di condividere un pulsante. Dal momento che non posso associargli azioni, una volta importato nel filmato principale, dovrò scrivere lo script nel filmato "libreria", prima di esportarlo. Quindi creo il pulsante, associo lo script, lo annido in un movieclip, concateno entrambi gli oggetti, e utilizzo entrambi nel filmato principale. Quando dovrò posizionare sullo stage il pulsante, al suo posto posizionerò il movieclip che lo contiene. E così il pulsante funzionerà correttamente.
E qui vanno fatte alcune considerazioni. Dal momento che il pulsante è annidato, dovrò tenerne presente il percorso nel definire lo script. Non potrà infatti contenere un'azione del tipo:
on(release){
play();
}
se voglio che lo scopo sia la riproduzione della timeline principale. Ma appunto:
on(release){
_root.play();
}
oppure
on(release){
_parent.play();
}
a seconda dei casi.
Inoltre, da momento che lo script, una volta esportato, non sarà più modificabile, o il pulsante (nel caso venga utilizzato in più filmati, appunto), avrà lo stesso utilizzo ovunque, oppure dovrò definirlo con l'uso di variabili o con richiamo ad una funzione, perchè lo script possa essere versatile.
Ad esempio definisco il pulsante con questo script:
on(release){
_root.funzione();
}
Poi nel filmato in cui utilizzo il pulsante, definisco la funzione in modo diverso, ad esempio in uno uso:
functionfunzione(){
_root.gotoAndPlay(15);
}
in un altro:
functionfunzione(){
loadMovieNum("filmato.swf", 1);
}
- Altri "bug" riportati, non ufficialmente, sono:
- difficoltà nel caricamento nel caso il filmato principale sia in un popup.
- un oggetto, utilizzato su un layer in una scena, nella scena seguente mantiene la posizione anche se questa volta è in un altro layer.
- interruzione della riproduzione del filmato all'utilizzo dell'oggetto, anche quando il caricamento della libreria abbia avuto buon fine.