Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 30 di 51
  • livello principiante
Indice lezioni

Facce del cubo con immagini esterne

Fino a ora abbiamo visto come applicare alle facce del cubo immagini interne al file Flash, in questa lezione carichiamo immagini da fonti esterne
Fino a ora abbiamo visto come applicare alle facce del cubo immagini interne al file Flash, in questa lezione carichiamo immagini da fonti esterne
Link copiato negli appunti

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

Ti consigliamo anche