Comunidad de diseño web y desarrollo en internet online

Cancelar un preloader AS3

Citar            
MensajeEscrito el 02 Abr 2009 11:45 pm
Saludos. Tengo la siguiente clase, que me sirve para cargar diferentes swf externos dentro de un MovieClip cada vez que presiono cualquiera de mis siete botones. Todo funciona bien, siempre y cuando espere a que se me cargue la película antes de presionar otro.

Y es que el problema viene cuando presiono uno de los botones y comienza el proceso de precarga, si presiono otro antes que termine de cargar se me van montando las precargas, el proceso se vuelve más lento y al final se me montan las películas una sobre otra dentro del movieclip. La preguntas es: ¿Como seria para cancelar el proceso del preloader, cuando presione otro botón si este aún no ha terminado?

Código :

package {
   import flash.text.*;
   import flash.net.*;
   import flash.display.*;
   import flash.system.*;
   import flash.events.*;

   public class boton_ir extends MovieClip {

      public function boton_ir() {
         preloader_mc.visible=false;
         with (menu_mc) {
            uno_btn.addEventListener(MouseEvent.CLICK, hace01);
            //.
            //.
            //.
            siete_btn.addEventListener(MouseEvent.CLICK, hace07);
         }
      }
      private function hace01(event:MouseEvent):void {
         hace("uno");
      }
      //.
      //.
      //.
      private function hace07(event:MouseEvent):void {
         hace("siete");
      }
      private function hace(a):void {
         var cargador:Loader = new Loader();
         cargador.contentLoaderInfo.addEventListener(Event.OPEN, onOpen);
         cargador.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
         cargador.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
         cargador.load(new URLRequest(a+".swf"));

         function onOpen(e:Event):void {
            if (ventana_mc.numChildren > 0) {
               ventana_mc.removeChildAt(0);
            }
            preloader_mc.visible=true;
         }

         function onProgress(e:ProgressEvent):void {
            var porc:Number=Math.round((e.bytesLoaded * 100)/e.bytesTotal);
            preloader_mc.porc_txt.text=porc + "%";
            preloader_mc.gotoAndStop(porc);
         }

         function onComplete(event:Event):void {
            preloader_mc.visible = false;
            ventana_mc.addChild(cargador);
            cargador.removeEventListener(Event.COMPLETE, onComplete);
         }
      }
   }// fin clase
}//fin paquete

Por Scarecrow

7 de clabLevel



 

msie7
Citar            
MensajeEscrito el 03 Abr 2009 01:53 pm
Tienes que usar el método Loader.close(), para ello tienes que crear una propiedad de clase que haga referencia al Loader en vez de crear uno nuevo en cada carga

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 03 Abr 2009 08:13 pm
Ok jorge, usare el método Loader.close(), vere que tal me va y te cuento. Si alguien más tiene una idea hay me dicen.

Por Scarecrow

7 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Abr 2009 04:52 pm
Bueno aún no logro solucionar mi problema y es que apenas estoy aprendiendo a trabajar con clases; si me pueden dar una mano y me explican como se hacer una propiedad con referencia al Loader.

Por Scarecrow

7 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Abr 2009 11:30 pm
prueba haciendo un metodo o funcion q cuando cliquees en un boton llame a una funcion q remueva el Loader anterior

Código :

Código :

var loadMov:Loader;
function pressBoton(event:MouseEvent):void
{

       if(loader!=null)
   {
      loadMov.close();
      loadMov.unload();
      //removemos el cargador o le bajamos el alpha
      removeChild(this.getChildByName("cargador"));
       //o sino
       cargador.alpha=0.0;
       trace("completeHandler: " + event);

      
   }
       loadMov.load(new URLRequest(link));
       addChild(loadMov);
       //le subimos el alpha o lo agregamos de nuevo si lo tenemos en la biblioteca como exportable para AC
       cargador.alpha=1;
       //agregamos escuchas
      loadMov.addEventListener(Event.COMPLETE, completeHandler);
      loadMov.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
      loadMov.addEventListener(Event.INIT, initHandler);
      loadMov.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
      loadMov.addEventListener(Event.OPEN, openHandler);
      loadMov.addEventListener(ProgressEvent.PROGRESS, progressHandler);

}
function completeHandler(event:Event):void {
         
         //removemos el cargador o le bajamos el alpha
         removeChild(this.getChildByName("cargador"));
                        //o sino
                        cargador.alpha=0.0;
         trace("completeHandler: " + event);
}
function progressHandler(event:ProgressEvent):void {
         var porcentage:int=int((event.bytesLoaded*100)/event.bytesTotal);
         //le decimos al cargador q se mueva q estara en nuestro MC q contendra el Loader y el cargador
         cargador.gotoAndStop(porcentage);
                        

         //trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}

Por javilu22

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Abr 2009 12:27 pm
Primero declaras el miembro

Código ActionScript :

....
 public class boton_ir extends MovieClip {
     private var cargador:Loader


Luego, dado que reutilizarás una sola instancia, puedes instanciarlo y agregar los listeners en el constructor:

Código ActionScript :

..
 public function boton_ir() {
         cargador = new Loader();
         cargador.contentLoaderInfo.addEventListener(Event.OPEN, onOpen);
         cargador.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
         cargador.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
        .....
}


Finalmente puedes agregar un try/catch a la descarga antes de cargar (para evitar posibles errores runtime)

Código ActionScript :

 private function hace(a):void {
         try{ cargador.close() } catch(e:Error){ trace("No está cargando "+e.message)}
         cargador.load(new URLRequest(a+".swf"));
         .........
}


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 Abr 2009 11:18 pm
Jorge he aplicado tu idea, pero ocurren un par de cosas.
-- Cuando el proceso de precarga va a medias y presiono otro botón, empieza de
nuevo la precarga, hasta ahi todo bien, pero después de llegar al 100%, continua contando hasta
llegar casi siempre al 200%, muestra la otra película y el trace me tira esto:

Código :

TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un  
objeto nulo.
at boton_ir/::onProgress()

sumándole en ocasiones que los demás botones quedan con ese problema, sin ni siquiera poder cargar
los demás SWF.

--También llega a bloquearse o sin responder totalmente la película.

javilu22, pongo el condicional en mi función "hace()", pero en las pruebas el trace me devuelve lo
siguiente:

Código :

Error: Error #2029: Este objeto URLStream no tiene una secuencia abierta.
   at flash.display::Loader/close()
   at boton_ir/::hace()
   at boton_ir/::hace01()

Muchas gracias por la ayuda, alguna idea???

Por Scarecrow

7 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Abr 2009 11:28 pm
Deshabilita el resto de los botones hasta que la carga se complete

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.