AS2 Utilizzo di MovieClipLoader

Introduzione all'utilizzo della classe

Inserito il 01-03-2007

Preludio

Non è mai facile abituarsi alle novità, nè nella vita di tutti i giorni, nè quando si ha a che fare con programmi e relativi linguaggi, che cambiano e implementano nuove risorse e nuove funzionalità, come fa spesso il nostro caro Adobe (formerly Macromedia) Flash.
Così ho pensato in questo articolo, a due anni di distanza dalla comparsa di questa "novità", di approfondire o quanto meno iniziare il lettore, all'utilizzo della classe MovieClipLoader.

Che cos'è?

In generale: la classe MovieClipLoader è un oggetto di programmazione come qualsiasi altro esistente in Flash (MovieClip, Button, TextField, Date ecc...) e come tale possiede proprietà e metodi (azioni) utilizzabili per portare a termine gli scopi di tale classe.

In sostanza: la classe MovieClipLoader si occupa di eseguire tutte quelle operazioni di calcolo che fino a Flash 6 eravamo costretti a farci a mano, utilizzando i classici preload, spesso imprecisi e quasi sempre inutili per le funzioni da compiere nel momento in cui il file esterno risultava caricato, ad esempio se utilizzate il seguente script per caricare un'immagine e poi ridimensionarla, nella maggior parte dei casi non riuscirete a farlo:

function preload (target) {
	var car = target.getBytesLoaded();
	var tot = target.getBytesTotal();
	if(car == tot){
		target._width = 300;
		target._height = 300;
		clearInterval(a);
	}
}
mio_mc.loadMovie("img.jpg");
a = setInterval(preload, 100, mio_mc);

questo perchè effettivamente c'è uno stacco tra il momento in cui l'immagine è stata caricata in flash e il momento in cui quest'immagine è realmente fruibile a livello di codice. Con un normale preload questo lasso di tempo non è calcolato, mentre la classe MovieClipLoader mette a disposizione dei metodi (eventi) separati che vengono eseguiti durante il caricamento secondo il momento, li vedremo in particolare uno per uno nella prosecuzione della lettura.
Inoltre, la classe è utile in quei casi in cui si deve verificare che un caricamento sia possibile, se ad esempio un file non esiste il caricamento non avverrà, mentre con i vecchi preload non era possibile verificare tale situazione di errore, con la classe MovieClipLoader è possibile, ancora grazie ad uno dei metodi dedicati.

Quando si usa

Ne consiglio l'utilizzo in tutti quei casi in cui sia necessario, a fine preload, eseguire altre operazioni strettamente legate al caricamento stesso del file esterno e nei casi in cui non si sia certi che l'immagine esista, in modo da poterne verificare l'errore di caricamento. In generale è possibile utilizzare la classe ogni qualvolta sia necessario effettuare un caricamento esterno, anche come abitudine generale di comportamento per evitare spiacevoli sorprese legate ai caricamenti esterni.

Come si usa

L'utilizzo della classe potrebbe essere difficoltoso inizialmente, per chi non ha mai utilizzato i "listener" di cui parleremo più avanti, ma una volta entrati nel meccanismo sarà facilissimo utilizzarla al meglio. Per prima cosa è necessario creare una istanza della classe in questo modo
var mcLoad:MovieClipLoader = new MovieClipLoader();
semplice no?! A questo punto, senza spaventarci troppo, vediamo il primo e, credo, più importante cambiamento a livello di codice per il caricamento: con la classe MovieClipLoader il vecchio loadMovie non deve essere più utilizzato, al suo posto c'è un metodo dedicato della classe, il metodo loadClip, riprendiamo il codice precedente e vediamo come funziona:

var mcLoad:MovieClipLoader = new MovieClipLoader();
mcLoad.loadClip("file_esterno.jpg", clip); 
// due parametri, 
// il primo è una stringa che sarà il nome+estensione del file esterno da caricare
// il secondo è il nome del MovieClip su cui caricare il file esterno

E questo è il minimo che si fa quando si vuole caricare un file esterno con la classe MovieClipLoader. Naturalmente la classe servirebbe a poco se si limitasse a questo, ecco quindi che per utilizzare al meglio la nostra classe dobbiamo utilizzare anche i gestori di eventi associati, che come già detto sopra, servono a gestire le azioni in determinati momenti/periodi del caricamento, le elenchiamo con la relativa spiegazione:

var mcList:Object = new Object();
 mcList.onLoadStart = function(target){
	// porto il clip che carica ad alpha 0
	target._alpha = 0;
	// attacco dalla libreria una barra, a coordinate 100,100 e gli minimizzo la scalaX
	_level0.attachMovie("preloader", "preloader", _level0.getNextHighestDepth(), {_x:100, _y:100, _xscale:0});
}
mcList.onLoadProgress = function(target, bytesLoaded, bytesTotal){ 
	// notare i tre parametri passati, tutti riconosciuti dall'onLoadProgress per monitorare il caricamento
	//
	// ottengo la percentuale con la solita proporzione
	var percentuale:Number = Math.floor((bytesLoaded/bytesTotal)*100);
	// ne assegno il valore alla scalaX della barra attaccata in precedenza
	_level0['preloader']._xscale = percentuale;
}
mcList.onLoadComplete = function(target){
	_level0['preloader'].removeMovieClip();
	target._alpha = 100;
}
mcList.onLoadInit = function(target) {
	target._x = target._width+100;
	target.onRelease = function(){
		trace(this._name);
		trace(this._x);
		trace(this._y);
	}
}

Finita la carrellata sui metodi ed il loro significato, passiamo a vedere come questi debbano essere effettivamente utilizzati. Per utilizzare i metodi su descritti abbiamo bisogno di affidarne l'inizializzazione ad un oggetto creato apposta per lo scopo, che verrà poi collegato al nostro MovieClipLoader attraverso il metodo addListener, in questo modo

var mcLoad:MovieClipLoader = new MovieClipLoader();
var mcList:Object = new Object();
mcList.onLoadInit = function(){
	trace("Inizializzato");
}
mcLoad.addListener(mcList);
mcLoad.loadClip("file_esterno.jpg", clip);

Conclusioni

Direi che per il momento possiamo fermarci qui, inserirò a breve un esempio completo da scaricare, in modo da avere un quadro completo sul modo di eseguire i caricamenti esterni, utilizzando la classe MovieClipLoader al posto dei vecchi metodi.

Update 22-06-2007

Come annunciato, metto a disposizione un esempio completo di utilizzo della classe, scaricabile all'indirizzo ../classes/moviecliploader.zip