Utilizzare immagini esterne
Negli esempi visti finora abbiamo sempre utilizzato immagini incluse all'interno del filmato Flash. Questo può andar bene per delle immagini piccole e se non vogliamo applicare cambiamenti, ma con immagini di dimensioni maggiori andiamo a incrementare la dimensione del file SWF e di conseguenza il tempo necessario a caricarlo. Utilizzando le immagini esterne, invece, possiamo mostrare la scena prima in forma "semplice" e poi applicare le texture una volta che le immagini sono state caricate, inoltre, possiamo applicare delle variazioni dinamiche all'aspetto degli oggetti senza dover ricompilare l'SWF.
Utilizziamo un MovieClipLoader per caricare l'immagine da una directory; sarà poi necessario convertire l'immagine in BitmapData.
Nella funzione createScene abbiamo allora:
Listato 34. Crea un movieClip che carica l'immagine
box = new Box(80,80,80,'tri');
// Creiamo un movieclip in cui caricare l'immagine
// e lo rendiamo trasparente
var holder:MovieClip = createEmptyMovieClip( "holder", getNextHighestDepth() );
holder._alpha = 0;
// Creiamo un MovieClip loader e un listener
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcLoader.addListener( this );
// Associamo l'evento di caricamento immagine alla funzione "paste"
onLoadInit = Delegate.create( this, paste );
mcLoader.loadClip( "petit110110.png", holder );
Il movieclip creato viene reso invisibile perchè non vogliamo mostrare l'immagine sullo stage, infatti il clip fa solo da contenitore "temporaneo" per l'immagine. Dopo di che creiamo un MovieClipLoader
e impostiamo gli script per intercettare l'evento onLoadInit
e quindi il caricamento completo dell'immagine.
"Delegazione" dell'evento
Non possiamo utilizzare un riferimento diretto dal MovieClipLoader
al gestore di eventi, perchè in questo caso il box non risulterebbe raggiungibile via script, dato che l'ambito in cui agirebbe il gestore di eventi sarebbe quello del loader stesso e non della funzione createScene
.
La gestione degli eventi in Actionscript 2 (e precedenti) infatti è nell'ambito dell'oggetto che lancia l'evento (il target).
La soluzione è "delegare" l'evento, associandolo quindi a un altro oggetto o funzione, utilizzando la classe mx.utils.Delegate
.
Questo comportamento è stato modificato in Actionscript 3, rendendo di fatto obsoleta la classe Delegate
.
Nel nostro esempio allora "deleghiamo" l'evento onLoadInit
utilizzando Delegate.create(this, paste)
, dove "this" è l'ambito che vogliamo utilizzare e "paste" è la funzione da richiamare.
La funzione "paste" ha questo codice:
Listato 35. Crea un oggetto BitmapData e disegna l'immagine
function paste( mc:MovieClip ) {
var bitmap:BitmapData = new BitmapData( mc._width, mc._height,true,0x00FFFFFF);
bitmap.draw( mc );
box.setSkin( new TextureSkin( bitmap ));
}
Quindi, quando l'immagine è stata completamente caricata, viene chiamata la funzione paste, che crea un oggetto BitmapData
delle stesse dimensioni del movieclip e vi disegna una copia dell'immagine. L'oggetto BitmapData
viene poi utilizzato come texture per il cubo.
Caricamento di dati tra domini diversi
Il MovieClipLoader
può caricare immagini da un qualsiasi web-server utilizzando un URL. Se l'SWF è caricato dal proprio server e le immagini risiedono invece su un server esterno, sono necessarie alcune modifiche per rendere possibile tale caricamento (detto cross loading). Il Flash player infatti ha un sistema di sicurezza denominato "sand box" che viene sfruttato per stabilire quali contenuti un filmato può eseguire.
Il Flash player permette di caricare i dati da un dominio esterno, ma non la loro manipolazione; è quindi possibile caricare un'immagine all'interno di un MovieClip, ma di default non è possibile sfruttare il metodo BitmapData.draw()
per copiarla e utilizzarla all'interno dell'Object3D. Per questo problema rimando alle soluzioni ufficiali Adobe.
Se invece l'immagine e il filmato risiedono sullo stesso dominio non c'è alcun problema nè restrizione.
"© Petit Publications 2006" - diritti riservati