zzzzzzzzzzzzup !
Ecco un altro articolo ( il terzo della serie ) che tratta l' argomento preloders con Flash CS3.
Abbiamo visto nel primo articolo
Preloader con Flash CS3 come creare un preloader utilizzando la Document Class ed un' altra classe ( necessita un discreto livello di conoscenza Actionscript 3.0 ).
Poi abbiamo visto nel tutorial
Preloader per principianti come poter creare un preloader scrivendo il codice solo sulla Timeline ( livello principianti ).
Entrambi i preloaders hanno una cosa in comune molto evidente e cioè il fatto che precaricano l' SWF principale in un altro SWF vuoto. Questo accade perchè la classe MovieClip di Actionscript 3.0 non ha più a disposizione i metodi getBytesLoaded e getBytesTotal, che sono stati spostati alla classe URLLoader che appunto è una classe che serve per caricare dei files esterni.
Vi ricordate che con Flash 8 ed Actionscript 2.0 si poteva creare un preloader nel primo keyframe della timeline che monitorasse i bytes dello stesso SWF mentre era in fase di caricamento ? ( appunto utilizzando i due metodi da me citati ).
Per chi si ricorda ( credo ognuno di voi ) sicuramente avrà provato a fare la stessa cosa con Flash CS3 senza ottenere lo stesso risultato.
Ma allora non è possibile ?!?
Certo che è possibile !* FlepStudio lo ha fatto.
Infatti in questo articolo vedremo come creare un preloader al proprio SWF senza doverne caricare un altro.
Lo vedremo in 2 modi:
- preloader dalla timeline
- preloader dalla Document Class
iniziamo la rhumba...
Partiamo con l' esempio del codice sulla Timeline.
Mi creo un FLA che salvo con nome ' test.fla ' .
Al suo interno mi creo un KeyFrame in più, in modo da averne due.
Scrivo uno stop() in entrambi i frames.
Metto tutto il contenuto nel secondo KeyFrame.
Inserisco un campo di testo dinamico nel primo KeyFrame che chiamo ' info_txt '.
Adesso, nel primo KeyFrame,dopo lo stop() che ho già scritto, inserisco il seguente codice:
Code:
this.addEventListener(Event.ENTER_FRAME,checkProgress);
function checkProgress(_progress:Event):void
{
var bytes_loaded:Number=_progress.target.loaderInfo.bytesLoaded;
var bytes_total:Number=_progress.target.loaderInfo.bytesTotal;
var percent:Number=Math.round(bytes_loaded/bytes_total*100);
info_txt.text=percent.toString()+' %';
if(percent>=100)
{
this.removeEventListener(Event.ENTER_FRAME,checkProgress);
this.gotoAndPlay(2);
lets_go();
}
}
function lets_go():void
{
trace('ready to start');
}
Analizzando il codice, possiamo notare che lavorando con ENTER_FRAME recupero la proprietà loaderInfo della TimeLine alla quale chiedo di mostrarmi i valori dei bytes caricati e quelli totali. Faccio un rapporto tra i due valori e quando giunge il mometo che il rapporto è 100, fermo ENTER_FRAME, faccio avanzare di un frame la timeline dicendogli gotoAndPlay(2) e chiamo una funzione che sarà quella che darà il via a tutta l' applizacione ( in questo caso un semplice trace ).
Qualcuno di voi si starà chiedendo, come mai usa gotoAndPlay invece di un semplice nextFrame ? Oppure, come mai non toglie lo stop sul secondo frame ed utilizza gotoAndStop(2) ?
Mi piacerebbe darvi una risposta logica e ragionevole ma purtroppo non ce l' ho ancora. Ho fatto le prove con nextFrame e gotoAndStop ma non funzionava.
Però, con gotoAndPlay e lo stop al secondo frame funziona benissimo !
Passiamo ora ad esaminare come poter fare la stessa cosa dalla Document Class.
Ho lo stesso identico ' test.fla ', però questa volta associato ad una Document Class che chiamo ' Test.as ' ed il codice al suo interno è quasi identico a quello dell' esempio precedente:
Code:
package
{
import flash.display.MovieClip;
import flash.text.TextField;
import flash.events.Event;
public class Test extends MovieClip
{
public function Test()
{
stage.frameRate=31;
this.addEventListener(Event.ENTER_FRAME,checkProgress);
}
private function checkProgress(_progress:Event):void
{
var bytes_loaded:Number=_progress.target.loaderInfo.bytesLoaded;
var bytes_total:Number=_progress.target.loaderInfo.bytesTotal;
var percent:Number=Math.round(bytes_loaded/bytes_total*100);
info_txt.text=percent.toString()+' %';
if(percent>=100)
{
this.removeEventListener(Event.ENTER_FRAME,checkProgress);
this.gotoAndPlay(2);
lets_go();
}
}
private function lets_go():void
{
trace('ready to start');
}
}
}
Allego i files sorgente: