2011-12-07 11 views
6

Le mie applicazioni flash sono un po 'grandi, quindi voglio incorporare un preloader nella mia applicazione, Quindi qualcuno può dirmi come creare un preloader nella nuova' Scena 'e caricare un'altra scena in dopo il pre-carico completato?Come creare il preloader in AS3

Grazie in anticipo!

risposta

12

Aggiornamento:

Opzione 1. IDE Flash, un file SWF

di avere un preloader incorporato quando si compila con Flash IDE, dovresti spostare il tuo codice Document Class in 2 ° fotogramma del tuo file FLA (senza costruttore di pacchetti e classi, ovviamente), e rimuovere il file Document Class .as da pr proprietà di oject. Nel primo frame è necessario posizionare tale codice:

stop(); // stops the timeline at preloader frame 
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress); 
function onProgress(e:ProgressEvent):void { 
    var percent:Number = Math.round(e.bytesLoaded/e.bytesTotal * 100); 
    //additional code to update preloader graphics 
    //.. 
    if (percent == 100) onLoaded(); 
} 
function onLoaded() { 
    this.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
    nextFrame(); 
} 

volta SWF viene caricato, esso avanza al fotogramma successivo e deve essere eseguito il codice di inizializzazione applicazione originale. Questo funziona bene se hai organizzato il tuo progetto in modo che la maggior parte delle risorse (immagini, ecc.) Siano nella libreria Flash IDE e non siano caricate sul primo fotogramma (puoi verificarlo nelle proprietà di ciascuna libreria).

Opzione 2. IDE Flash, due file SWF

un'altra opzione, come già consigliato da un altro commentatore, è quello di mantenere il vostro swf applicazione così com'è, e creare un altro swf leggero che avrebbe caricare il primo . Il codice di preloader.swf nel primo fotogramma:

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress); 
loader.load(new URLRequest("path/to/application.swf")); 

function onProgress(e:ProgressEvent):void 
{ 
    var percent:Number = Math.round(e.bytesLoaded/e.bytesTotal * 100); 
    //additional code to update preloader graphics 
    //.. 
    if (percent == 100) onLoaded(); 
} 
function onLoaded():void 
{ 
    loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
    var application:DisplayObject = loader.content; 
    addChild(application); 
} 

a volte ci sono altri problemi con questo approccio, quando si tenta di accedere stage dal Document Class constructor ecc, ma per la maggior parte dei casi questo dovrebbe fare il lavoro.

Opzione 3. Differente IDE, la mia raccomandazione:FlashDevelop

Se si è tentato di compilare il mio codice originariamente pubblicato con FlashDevelop, Flash Builder o qualsiasi altro IDE, dovrebbe funzionare.

Original post:

Ecco un setup di base per un preloader incorporato.Il tuo Document Class dovrebbe assomigliare a questo:

package { 

    import flash.display.Sprite; 

    [Frame(factoryClass='Preloader')] //class name of your preloader 

    public class Main extends Sprite { 

    public function Main() { 
     //init 
    } 
    } 
} 

Preloader Classe:

package { 

    import flash.display.DisplayObject; 
    import flash.display.MovieClip; 
    import flash.events.ProgressEvent; 
    import flash.utils.getDefinitionByName; 

    public class Preloader extends MovieClip { 

    public function Preloader() 
    { 
     //add preloader graphics 

     //check loading progress 
     this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress); 
    } 
    private function onProgress(e:ProgressEvent):void 
    { 
     var percent:Number = Math.round(e.bytesLoaded/e.bytesTotal * 100); 
     if (percent == 100) 
     { 
      this.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
      onLoaded(); 
     } 
    } 
    private function onLoaded():void 
    { 
     nextFrame(); //go to next frame 
     var App:Class = getDefinitionByName("Main") as Class; //class of your app 
     addChild(new App() as DisplayObject); 
    } 
    } 
} 
+0

funzione OnProgress non è in esecuzione .... :( –

+0

si fa a ottenere eventuali errori? Riesci a mostrare il vostro codice in materia di precarico e l'inizializzazione del 'documento class'? – package

+0

No non ottenere alcun messaggio di errore e il mio docum la classe è esattamente la stessa di qualunque cosa tu abbia detto. –

0

È inoltre possibile utilizzare libreria di 3a parte come Greensock per precaricare sia prima dell'inizio dell'applicazione e mentre l'applicazione dei file da caricare.

Io personalmente uso Greensock e lo consiglio. Risolve alcuni bug con la classe loaderInfo.

http://www.greensock.com/loadermax/