Comunidad de diseño web y desarrollo en internet online

Disparar eventos entre clases + timer

Citar            
MensajeEscrito el 07 Abr 2009 10:02 pm
Hola a todos,

soy novato en actionscript y por ahora iba aprendiendo sin problemas hasta que al hacer una prueba para pasar un evento entre clases la cosa se ha parado. Inicialmenet (luego me ha surgido una curiosidad no esperada con un timer. Esta descrito más abajo) quería comprobar desde una clase la pulsación de un boton en otraclase distinta. Declaré mi propia subclase de evento y mi listener pero desde el listener no recibía nada. Fuy reduciendo el código para despejar errores y al final llegué a esta sencilla prueba. Tengo un Main.as desde el que quiero procesar un evento disparado en otra clase(events.Sender). El código es muy pequeño:

La clase principal:

Código :

package {
   import flash.display.MovieClip;
   import flash.events.*;
   import flash.utils.Timer;

   import events.Sender;
   public class Main extends MovieClip {

      private var sender:Sender = new Sender();
      public function Main() {
         // add callback function
         addEventListener(Sender.EVENT_NAME,processEvent,false,0,true);

         // start timer
         var myTimer:Timer = new Timer(2000, 2);
         myTimer.addEventListener("timer", timerHandler);
         myTimer.start();

      }
      public function timerHandler(event:TimerEvent):void {
         trace("timerHandler: " + event);
         sender.fireEvent();
      }

      public function processEvent(e:Event) {
         trace("processEvent() Got:" +e);
      }
   }
}


La clase Sender:

Código :

//file events/Sender.as
package events{

   import flash.events.Event;
   import flash.display.MovieClip;
   

   public class Sender extends MovieClip{
      public static const EVENT_NAME:String='my_event';
      public function Sender() {
         trace("Sender()");
      }
      public function fireEvent():void {      
         dispatchEvent( new Event(Sender.EVENT_NAME));
         trace("Sender.triggerOptionSelected() DISPATCHED");

      }
   }
}


Aquí teneis la salida:

Código :

Sender()
timerHandler: [TimerEvent type="timer" bubbles=false cancelable=false eventPhase=2]
Sender.fireEvent() DISPATCHED
timerHandler: [TimerEvent type="timer" bubbles=false cancelable=false eventPhase=2]
Sender.fireEvent() DISPATCHED

Cuando miro el output suceden dos cosas:
1º la función timerHandler() se llama dos veces: no entiendo por qué no se llama solo una :o
2º la función processEvent() no se llama nunca: esto era mi duda inicial

He revisado muchos tutoriales y he ido simplificando hasta llegar a esto, pero la verdad es que después de darle mil vueltas no sé por qué suceden estas dos cosas.

Agradecería mucho que alguien me orientase un poco sobre qué estoy haciendo mal, o cual sería la manera optima para procesar pulsaciones de boton desde otra clase.

Muchas gracias ;-)

Por jpgmahedero

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Abr 2009 12:21 am
Hola!!

Para el punto uno donde timerHandler(); se llama 2 veces esto pasa porque tu lo llamas dos veces:

Código ActionScript :


 var myTimer:Timer = new Timer(2000, 2); 
//New Timer recibe dos parametros (delay:Number, repeatCount:int = 0) 
//Tu especificas 2 cambialo a 1 
var myTimer:Timer = new Timer(2000, 1); 



Para lo segundo haces esto:

Código ActionScript :


//Aplicas un listener directo ala aplicacion que es lo mismo que poner this.add.......... 
addEventListener(Sender.EVENT_NAME,processEvent,false,0,true); 
//This nunca despcha este evento el listener ponselo a sender, sender.add 


Ahora lo anterior me parece incorrecto no es la forma de tener eventos customizados,implementa mejor algo asi:

Código ActionScript :


package { 
   import flash.events.Event; 
 
       //Extiendes de event porque quieres hacer una clase de eventos 
   public class Sender extends Event { 
                //Puedo agregar las constantes que necesite,agrego otra sin ningun problema  
                //Como lo tienes im plementado necesitas poner una funcion despachadora para cada evento  
               //yo puedo tener cualquier cantidad sin problema  
       public static const EVENT_NAME:String='my_event'; 
                 public static const EVENT_DOS:String='my_event2'; 
 
               //En tu constructor usas un super para ejecutar el constructor de la superclase Event 
      public function Sender(type:String, bubbles:Boolean = false, cancelable:Boolean = false) { 
         super(type,bubbles,cancelable); 
 
      } 
   } 
} 



Y con tu clase ya solo la usas de esta manera:

Código ActionScript :


 import events.Sender; 
//pones un objeto despachador yo uso por lo general un SimpleButton vacio 
var despachador:SimpleButton=new SimpleButton(); 
//como despachador va obviamente a despachar cada evento custom entonces le pones los listeners 
despachador.addEventListener(Sender.EVENT_NAME,processEvent,false,0,true); 
despachador.addEventListener(Sender.EVENT_DOS,otraFuncion); 
 
//Son tus eventos asi que tu los despachas cuando los necesitas 
despachador.dispatchEvent( new Sender(Sender.EVENT_NAME)); 



Saludos!!

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Abr 2009 12:24 am
Creo que se llama dos veces por que lo tienes asi.

Código :

var myTimer:Timer = new Timer(2000, 2);

debes dejarlos con solo 1

Código :

var myTimer:Timer = new Timer(2000, 1);


Para comunicar las clases entre si es muy util utilizar el patrón singleton, investiga un poco en el foro. Pero sin ese patron igual se pueden comunicar. En la clase Sender deberías colocar algo asi.

Código :

import flash.display.Stage
private var escenario         :Object            = new Object();


y en el constructor colocar algo asi

Código :

public function Sender(raiz:Object) 
{
   escenario   = raiz;      
   trace("Sender()");
}

Y en el main cuando instancias la clase colocas

Código :

private var sender:Sender = new Sender(this);

y cuando disparas el evento colocas

Código :

escenario.dispatchEvent( new Event(Sender.EVENT_NAME));


Prueba con esto o por lo menos con el concepto. No estoy seguro que te funcione pero en proyecto que hice hace rato me funciono bien.

Por AXM

Claber

705 de clabLevel

8 tutoriales

Genero:Masculino  

Bogotá

firefox
Citar            
MensajeEscrito el 08 Abr 2009 03:55 pm
Muchas gracias por las aportaciones ;-)

efectivamente, el problema era que el listener tiene que escuchar al objeto sender y no a this que era lo que yo hacía. Igualmente en la documentacion de Timer vi el funcionamiento del segundo parámetro.

gracias de nuevo. Jose Pedro

Por jpgmahedero

5 de clabLevel



 

firefox

 

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