Comunidad de diseño web y desarrollo en internet online

Eliminar interval de una clase, desde otra clase.

Citar            
MensajeEscrito el 24 Feb 2009 04:05 pm
Hola que tal tengo camaradas...

Pues como todos estoy empezando a desarrollar mis proyectos con AS3 pero eh topado cn un problemita, le explico.

Tengo una pelicula llamada index.swf al cual me crea un menu dinamico desde un xml con una clase de AS3, al finalizar la aparicion del menu mando a cargar un swf llamado inicio.swf dentro un objeto loader creado atraves de una clase que llamada PreCargador, ese archivo (inicio.swf) contiene un slideShow de fotos (el cual funciona con un interval), hasta ahi todo bien el problema que tengo es que cuando le pico a un boton para que me cargue otra seccion si lo hace, pero no remueve el interval que se encuentra en el swf "inicio.swf".

Espero haber sido lo suficiente explicito. les dejo los codigos para ver que se puede hacer de ante mano gracias

En el archivo index.swf

Código :

var ruta:String = "../includes_xml/menugral.xml";
var posX:int = 215;
var posY:int = 47;
var miMenuXML:CargaMenuXML = new CargaMenuXML(ruta,posX,posY);
miMenuXML.name = "mcMenu";
this.addChild(miMenuXML);
stop();


La clase CargaMenuXML

Código :

package includes_as{

   import flash.net.URLLoader;
   import flash.net.URLRequest;
   import flash.text.TextField;
   import flash.display.*;
   import flash.events.*;
   import flash.utils.*;
   import fl.transitions.*;
   import fl.transitions.easing.*;

   import includes_as.TipoFuente;
   import includes_as.PreCargador;

   public class CargaMenuXML extends Sprite {

      private var miCargaXML:URLLoader;
      private var miIntervaloMenu:uint;
      private var movimiento:Tween;
      private var miMenu:MovieClip;
      private var mascaraMenu:mascaraMenuMc;
      public var posXMenu:int;
      private var posYMenu:int;
      private var noNodos:int;
      private var botonActual:String;
      private var botonAnterior:String;
      private var rutaSeccionCargar:String;

      public function CargaMenuXML(ruta:String, posx:int, posy:int) {
         
         posXMenu = posx;
         posYMenu = posy;
         rutaSeccionCargar = "";
         
         var miRutaXML:URLRequest = new URLRequest(ruta);
         miCargaXML = new URLLoader(miRutaXML);
         miCargaXML.addEventListener(Event.COMPLETE,xmlCargado);

      }
      
      private function xmlCargado(eventObj:Event):void {

         try {

            var miXML:XML = new XML(miCargaXML.data);

            noNodos = miXML.elements("*").length();
                     
            miMenu = new MovieClip();
                  
            mascaraMenu = new mascaraMenuMc();
            
            mascaraMenu.x = miMenu.x = posXMenu;

            mascaraMenu.y = miMenu.y = posYMenu;
            
            this.addChild(miMenu);

            this.addChild(mascaraMenu);
            
            var formato:TipoFuente = new TipoFuente(13, false);

            var posXBoton:int = 0;

            for (var i:int=0; i<noNodos; i++) {

               var miBoton:MovieClip = new botonMc();

               miBoton.txtNombre.defaultTextFormat = formato.miFormato;

               miBoton.txtNombre.embedFonts = true;

               miBoton.txtNombre.text = miXML.elemento[i].@nombre;
               
               miBoton.txtNombre.selectable = false;

               miBoton.x = posXBoton;

               miBoton.y = -miBoton.height;
                     
               miBoton.name = miXML.elemento[i].@nombre
               
               miBoton.seccion = miXML.elemento[i].@secc

               miBoton.addEventListener(MouseEvent.MOUSE_OVER, menuOver);

               miBoton.addEventListener(MouseEvent.MOUSE_OUT, menuOut);
               
               miBoton.addEventListener(MouseEvent.MOUSE_DOWN, menuRelease);

               miBoton.buttonMode = true;

               miBoton.mouseChildren = false;

               posXBoton = posXBoton+miBoton.width+2;

               this.miMenu.addChild(miBoton);

            }
            
            this.miMenu.mask = this.mascaraMenu;

            iniMovBoton(0);


         } catch (e:TypeError) {

            trace("No se encontró el fichero de XML!!!");

            trace(e.message);

         }

      }
      
      private function iniMovBoton(idboton:int):void {

         miIntervaloMenu = setInterval(movBoton, 300, idboton);

      }
      
      private function movBoton(idboton:int):void {

         clearInterval(miIntervaloMenu);
         
         if (idboton<noNodos) {

            var boton:String = this.miMenu.getChildAt(idboton).name;
            
            var alturaBoton:int = this.miMenu.getChildAt(idboton).height;

            movimiento = new Tween(this.miMenu.getChildByName(boton), "y", Regular.easeInOut, -alturaBoton, 0, .6, true);

            idboton++;

            iniMovBoton(idboton);

         } else {
                        
            botonActual = "Inicio";
            
            botonAnterior = "";
            
            botonSeleccionado();
            
            var cargadorSeccion:PreCargador = new PreCargador(rutaSeccionCargar,"inicio.swf");
            
            cargadorSeccion.name = "mcContenedorSecc";
            
            this.parent.addChild(cargadorSeccion);
            
         }
         
      }
      
      private function botonSeleccionado():void{
         
         var btnActual:MovieClip = this.miMenu.getChildByName(botonActual) as MovieClip;      
         btnActual.txtNombre.textColor = 0xFFCC00;
         btnActual.removeEventListener(MouseEvent.MOUSE_OVER, menuOver)
         btnActual.removeEventListener(MouseEvent.MOUSE_OUT, menuOut)
         btnActual.removeEventListener(MouseEvent.MOUSE_DOWN, menuRelease)
         btnActual.buttonMode = false;
         
         if(botonAnterior!=""){
            
            var btnAnterior:MovieClip = this.miMenu.getChildByName(botonAnterior) as MovieClip;
            btnAnterior.txtNombre.textColor = 0xFFFFFF;
            btnAnterior.addEventListener(MouseEvent.MOUSE_OVER, menuOver)
            btnAnterior.addEventListener(MouseEvent.MOUSE_OUT, menuOut)
            btnAnterior.addEventListener(MouseEvent.MOUSE_DOWN, menuRelease)
            btnAnterior.buttonMode = true;
         
         }
         
      }
      
      
      private function menuOver(eventObj:MouseEvent):void {

         var boton:MovieClip = eventObj.target as MovieClip;
         
         boton.txtNombre.textColor = 0xFFCC00;

      }
      
      private function menuOut(eventObj:MouseEvent):void {

         var boton:MovieClip = eventObj.target as MovieClip;
         
         boton.txtNombre.textColor = 0xFFFFFF;

      }
      
      private function menuRelease(eventObj:MouseEvent):void {
      
         var boton:MovieClip = eventObj.target as MovieClip;
         
         botonAnterior = botonActual;
         
         botonActual = boton.name;
         
         botonSeleccionado();
         
         var seccionActual:Sprite = this.parent.getChildByName("mcContenedorSecc") as Sprite;
               
         var contenedor:Loader = seccionActual.getChildByName("mcCargadorSecc") as Loader;
      
         contenedor.unload();
         
         var cargadorSeccion:PreCargador = new PreCargador(rutaSeccionCargar, boton.seccion);
            
         cargadorSeccion.name = "mcContenedorSecc";//getChildAt(5)
            
         this.parent.addChild(cargadorSeccion);
         
         
      }

   }

}



La clase PreCargador

Código :

package includes_as{
   
   import flash.net.URLLoader;
   import flash.net.URLRequest;
   import flash.display.*;
   import flash.events.*;
   import flash.utils.*;
   
   public class PreCargador extends Sprite {
      
      private var preCargador:precargadorMc;
      
      public function PreCargador(ruta:String, archivo:String){
            
         var seccionSwf:URLRequest = new URLRequest(ruta+archivo);
         var contSeccion:Loader = new Loader();
         contSeccion.x = 25;
         contSeccion.y = 140;
         contSeccion.load(seccionSwf);
         contSeccion.name = "mcCargadorSecc";
         
         contSeccion.contentLoaderInfo.addEventListener(Event.OPEN, inicioCargador);
         contSeccion.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progresoCargador);
         contSeccion.contentLoaderInfo.addEventListener(Event.COMPLETE, terminoCargador);
      
         this.addChild(contSeccion);
      
      }
      
      private function inicioCargador(eventObj:Event):void{
         
         preCargador = new precargadorMc();
            
         preCargador.x = stage.width/2-preCargador.width/2;
         preCargador.y = stage.height/2-preCargador.height/2;
         preCargador.name = "cargador"; 
         
         this.addChild(preCargador);
         
      }
      
      private function terminoCargador(eventObj:Event):void{
         
         this.removeChild(preCargador);
      
      }
      
      private function progresoCargador(eventObj:ProgressEvent):void{
         
         var bytesTotales:uint = eventObj.bytesTotal;
         
         var bytesCargados:uint = eventObj.bytesLoaded;

         var porcentaje:uint = 100*(bytesCargados/bytesTotales);
         
         preCargador.txtCargador.text = "Cargando "+porcentaje+"%";
                           
      }
      
   }
   
}


En el archivo inicio.swf

Código :

import includes_as.SlideShow;
var miRuta:String = "../includes_xml/principal.xml";
var slideShow:SlideShow = new SlideShow(miRuta);
slideShow.name = "mcBannerImg";
this.addChild(slideShow);


La clase SlideShow

Código :

package includes_as{
   
   import flash.net.URLLoader;
   import flash.net.URLRequest;
   import flash.display.*;
   import flash.events.*;
   import flash.utils.*;
   import fl.transitions.*;
   import fl.transitions.easing.*;
      
   public class SlideShow extends Sprite {
      
      private var miCargaXML:URLLoader;
      //private var imagenCargar:URLRequest;
      private var preCargador:precargadorMc;
      public var intervaloImagen:uint;
      private var apareceImagen:Tween;
      private var rutaImagenCargar:String;
      private var noImagen:int;
      private var posXContenedorImg:int;
      private var posYContenedorImg:int;
      private var contImagen:Loader;
      private var noNodos:int;
      private var misImagenes:Array;
               
      public function SlideShow(ruta:String){
         
         noImagen = 0;
         rutaImagenCargar = "../images/";
         posXContenedorImg = 10;
         posYContenedorImg = 10;

         var miRutaXML:URLRequest = new URLRequest(ruta);
         miCargaXML = new URLLoader(miRutaXML);
         miCargaXML.addEventListener(Event.COMPLETE,xmlCargado);
      
      }
            
      private function xmlCargado(eventObj:Event):void {

         try {

            var miXML:XML = new XML(miCargaXML.data);

            noNodos = miXML.elements("*").length();
            
            misImagenes = new Array(noNodos);
            
            for (var i:int=0; i<noNodos; i++) {

               misImagenes[i] = miXML.elemento[i].@foto;

            }
                     
            cargarImagen();

            
         } catch (e:TypeError) {

            trace("No se encontró el fichero de XML!!!");

            trace(e.message);

         }

      }
      
      private function cargarImagen():void{         
         
         var imagenCargar:URLRequest = new URLRequest(rutaImagenCargar+misImagenes[noImagen]);
         
         contImagen = new Loader();         
         contImagen.load(imagenCargar);
         contImagen.x = posXContenedorImg;
         contImagen.y = posYContenedorImg;
         contImagen.name = "mcCargadorImg"
         contImagen.contentLoaderInfo.addEventListener(Event.OPEN, inicioCargador);
          contImagen.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progresoCargador);
         contImagen.contentLoaderInfo.addEventListener(Event.COMPLETE, terminoCargador);

         this.addChild(contImagen);
                              
      }
      
      private function inicioCargador(eventObj:Event):void{
         
         preCargador = new precargadorMc();
         
         preCargador.x = stage.width/2-preCargador.width/2;
         preCargador.y = stage.height/2-preCargador.height/2;
                  
         this.addChild(preCargador);
            
      }
      
      private function terminoCargador(eventObj:Event):void{
         
         apareceImagen = new Tween(contImagen, "alpha", Regular.easeOut, 0.1, 1.0, 2, true);
         
         this.removeChild(preCargador);
         
         if(noNodos>1){
                  
            inicioCambioImagen();
         
         }
      
      }
      
      private function progresoCargador(eventObj:ProgressEvent):void{
         
         var bytesTotales:uint = eventObj.bytesTotal;
         var bytesCargados:uint = eventObj.bytesLoaded;
         var porcentaje:uint = 100*(bytesCargados/bytesTotales);
            
         preCargador.txtCargador.text = "Cargando "+porcentaje+"%";
                           
      }
      
      private function cambioImagen():void{
               
         clearInterval(intervaloImagen);
         
         if(noImagen<noNodos-1){
            
            noImagen++
            
            cargarImagen();
            
         }else{
            
            noImagen = 0
            
            cargarImagen();
            
         }
                  
      }
      
      private function inicioCambioImagen():void{
         
         intervaloImagen = setInterval(cambioImagen, 15000);
      
      }
   
   }   
   
}

Por elessar

Claber

166 de clabLevel



 

Tabasco, México

msie7
Citar            
MensajeEscrito el 24 Feb 2009 04:22 pm
Elessar, reconozco que leer tanto código me da cierta pereza. Así que dejo unos apuntes
1.-NO uses un setInterval sino un Timer poque vas a tener más control y menos dolores de cabeza
2.-Crea un método (función) en tu clase que pare dicho Timer
3.-Sólo tendrás que llamar a ese método desde tu clase principal

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 05:18 pm
Eliseo2 gracias por tu respuesta el detalle es que el timer por lo que veo tiene un limite de repeiticiones y yo lo que quiero es que si llega al final se reinicie...

Saludos.

Por elessar

Claber

166 de clabLevel



 

Tabasco, México

msie7
Citar            
MensajeEscrito el 24 Feb 2009 06:00 pm
Si no le dices el número de veces que se ha de repetir (o es 0) se repetirá indefinidamente (hasta que hagamos un stop)
Si te aconsejo usar un Timer no es de modo gratuíto, es que me he pegado contra la pared tantas veces con los setInterval en AS.1 que los "tengo aborrecidos"

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 07:05 pm
Eliseo2 ya hice el cambio sin embargo tengo el mismo pecs no detengo el timer, es que mi problema es que no encuentro como llegar a donde esta la funcion ( metodo ) para detenerlo. debido al nivel de anidamiento de mis swf.

Por elessar

Claber

166 de clabLevel



 

Tabasco, México

firefox
Citar            
MensajeEscrito el 25 Feb 2009 07:39 am
P:¿Dónde está definido el Timer?
R:En La Clase SlideShow
P:¿dónde está el "objeto" de tipo SlideShow?
R:En inicio.swf
Conclusión, en inicio.swf podríamos tener un método "pararTimer"

Código ActionScript :

public function pararTimer():void{
        slideShow.Timer.stop(); //<--si Timer es público, sino haz una función getSet que te devuelva el Timer
}

P:¿Cuándo queremos llamar a ese método?
R:Cuando le "pico" a un botón
P¿Dónde están se crean los botones?
R:En la Clase CargaMenuXML
P:¿dónde está inico.swf?
R:En un "loader"que está en la Clase CargaMenu
puff, creo que es

Código ActionScript :

//en la clase CargaMenu
//loader.content.pararTimer()
//como habrá que hacer una "conversión de cast"
SlideShow(loader.content).pararTimer()

NOTA:"loader" he supuesto que es una variable que "pertenece" a la Clase "CargaMenu" que hace referencia al Loader que creas
NOTA2:La verdad es que no estoy muy seguro de haber acertado
NOTA3:Puedes probar a hacer un

Código ActionScript :

trace(this)

Tanto en la clase SlideShow como en la clase CargaMenu, para ver exactamente donde están

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Mar 2009 05:50 pm
Para la comunicación entre clases sin importar la jerarquia, yo utilizo una clase Singleton que despacha eventos y almacena variables estáticas que pueden ser compartidos a nivel global con todas las clases que lo necesiten.

La estructura podria ser esta:

site - secciones - Home.as
site - secciones - Seccion1.as

site - global - Singleton.as
site - global - EventosGlobales.as

en Singleton.as

Código :

package site.global
{
   public class Singleton {


   }
}


en EventosGlobales.as

Código :

package site.global{
    import flash.events.EventDispatcher;
   
    public class EventosGlobales extends EventDispatcher {

        private static var _instancia:EventosGlobales;

        public static const EVENTO1:String = "evento1";
        public static const EVENTO2:String = "evento2";

        //variable que guarda la ubicacion del stage y el root de la Clase principal.
        public static var stage:Object;     
        public static var rootAbsoluto:Object;

        public function EventosGlobales( s:Singleton ) { 
            trace("Global iniciado");
        }

        public static function getInstancia():EventosGlobales {

            if (_instancia == null) {
                EventosGlobales._instancia = new EventosGlobales(new Singleton);
            }
            
            return _instancia;
        }
    }
}


en Home.as

Código :

package site.sections
{

    public class Home extends Sprite {

        private var _global:EventosGlobales = EventosGlobales.getInstancia();

        public function Home() { 
            EventosGlobales.stage = stage;
            EventosGlobales.rootAbsoluto = this;
         _global.dispatchEvent( new Event( EventosGlobales.EVENTO1 ) );
         _global.addEventListener( EventosGlobales.EVENTO2, evento2Hnd );
        }
        
        private function evento2Hnd( e:EventosGlobales ):void {
           
        }

    }
}




En Seccion1.as

Código :

package site.sections
{

    public class Seccion1 extends Sprite {

        private var _global:EventosGlobales = EventosGlobales.getInstancia();
      private var _rootAbsoluto:Object = EventosGlobales.rootAbsoluto;
      
        public function Seccion1() { 
             if (!stage){
                stage = EventosGlobales.stage;
             }
            _rootAbsoluto = _global.rootAbsoluto;
            //traza [Function function]
            trace ( _rootAbsoluto.evento2Hnd ); 
            _global.dispatchEvent( new Event( EventosGlobales.EVENTO2 ) );
         _global.addEventListener( EventosGlobales.EVENTO1, evento1Hnd );
        }
        
        private function evento1Hnd( e:EventosGlobales ):void {
           //traza [Class Seccion1] desde Home.as
           trace ( this );
        }
    }
}


Puedes comunicar las clases despachando y escuchando eventos y acceder a las variables instanciadas en EventosGlobales.as desde cualquier clase.

Para que funcione no debes instanciar la clase, para eso esta Singlelton.as, para que de error en caso de hacer un new EventosGlobales();

Por enreda

6 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Mar 2009 12:51 am
Les agradezco mucho sus respuestas ya logre resolver el problema desde hace unos dias todo era agregar la ruta de los objetos para llegar al metodo.

Saludos

Por elessar

Claber

166 de clabLevel



 

Tabasco, México

firefox

 

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