Comunidad de diseño web y desarrollo en internet online

Problema con contador y stage.removeEventListener

Citar            
MensajeEscrito el 03 Sep 2012 09:47 pm
Saludos amigos a ver si me pueden ayudar con algo muy sencillo (al parecer) pero que me está "hirviendo la cabeza"

Tengo una aplicación Drag and Drop en la cual puse un contador para ir sumando cada vez que se agrega un ingrediente en un caldero haga una suma, si esa suma es tres, es decir, si el usuario arrastro 3 objetos al caldero pasar al frame 3
Código ActionScript :

Código ActionScript :

package net.dnddigital.dragdrop
   {

   import flash.events.MouseEvent;
   import flash.display.MovieClip;
   import flash.geom.Point;
   
   public class ObjetoArrastrable extends MovieClip 
   {
      protected var posicionOriginal:Point;
      public var contador:uint = 0;

      public function ObjetoArrastrable() 
      {
         posicionOriginal=new Point(x,y);
         buttonMode=true;
         addEventListener(MouseEvent.MOUSE_DOWN, down);
      }
      
      protected function volverAlInicio():void 
      {
         x=posicionOriginal.x;
         y=posicionOriginal.y;
      }

      protected function down(event:MouseEvent):void 
      {

         parent.addChild(this);
         startDrag();
         stage.addEventListener(MouseEvent.MOUSE_UP, stageUp);
      }

      protected function stageUp(event:MouseEvent):void {
         
         trace(dropTarget.parent.name);
         stage.removeEventListener(MouseEvent.MOUSE_UP, stageUp);
         stopDrag();
         
         
            if (dropTarget.parent.name=="caldero") 
            {
               contador++;
               trace(contador);               
               y=stage.stageHeight-height+500;
               buttonMode=false;
               
               if (contador==3) 
                     {
                        trace("ahora");
                        MovieClip(this.parent).gotoAndStop(3);
                        removeEventListener(MouseEvent.MOUSE_DOWN, down);
                        
                     }
               
   
            }else{volverAlInicio();}

         
      }
   }
}

El problema es que mi contador "no cuenta" porque al parecer la línea de stage.removeEventListener(MouseEvent.MOUSE_UP, stageUp); me resetea el stage o algo así, y cuando agrego otro objeto sigue diciendo que fue "1" y no "2" o "3". Si saco esa linea el programa se corrompe muchísimo...

Alguna sugerencia?
De antemano gracias

Por pezweb

13 de clabLevel



 

Flash Developer

chrome
Citar            
MensajeEscrito el 04 Sep 2012 12:20 pm
Estas trazando el contador, ¿te aparece en la ventana de salida? ¿3 veces?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Sep 2012 12:36 pm
Sí, te escribo lo que sale en el output:
Aparece..

1
1
1

cuando debería ser:

1
2
3

(la idea es que cuando arrastre 3 veces un objeto la película avance al frame 3)
Pero es como que reiniciara cada vez que arrastro y suelto con Drag And Drop

Por pezweb

13 de clabLevel



 

Flash Developer

chrome
Citar            
MensajeEscrito el 04 Sep 2012 12:39 pm
Ok, el problema es que pusiste el contador en cada uno los objetos que arrastras (que obviamente solo se cuentan a si mismos) cuando deberías ponerlo en el que los recibe, por ejemplo el caldero

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Sep 2012 01:02 pm
Entiendo a lo que te refieres, pero aún no se me ocurre como solucionarlo, nosé como relacionar el caldero con los objetos que drag y dropeo. Pero de todas formas espero que con tu indicación llegue a la lógica que necesito, muchas gracias!

Por pezweb

13 de clabLevel



 

Flash Developer

chrome
Citar            
MensajeEscrito el 04 Sep 2012 01:04 pm
Tienes dos opciones:

- La peor desde el punto de vista del diseño pero la mas simple de implementar es que cada elemento que caiga en el caldero llame a un método en caldero o modifique una variable publica de caldero
- Lo mas adecuado desde el punto de vista del diseño es que cada elemento que sea dropeado correctamente genere un evento al que esté subscripto caldero, que es quien lleva la cuenta

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Sep 2012 01:49 pm
Gracias, estoy ahora tratando de resolverlo, sólo que me pierdo en la sintaxis

Por pezweb

13 de clabLevel



 

Flash Developer

chrome
Citar            
MensajeEscrito el 04 Sep 2012 02:17 pm
Me pregunto como referenciar a "Caldero", es un objeto que tengo instanciado desde el escenario, pero desde una clase externa no puedo referirme a él

Por pezweb

13 de clabLevel



 

Flash Developer

chrome
Citar            
MensajeEscrito el 04 Sep 2012 02:22 pm
En la medida en que algo está en el DisplayList (es decir es visible en el escenario) es accecible via nombre de instancia si le pusiste, o getChildAt desde la línea de tiempo que lo contiene

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Sep 2012 03:21 pm
Comprendo que desde el timeline se pueda acceder a un movieclip instanciado y tb con getchildAt, pero desde una Clase externa no puedo referenciar a un objeto instanciado en el stage. He creado una clase Caldero_mc para manejar los eventos de ese Movieclip pero no se como referenciarlo desde su clase externa. (He linkeado el MC de la libreria a una clase propia para el)

Perdón mi ignorancia, soy muy novato en programación con AS3, de hecho agradezco la ayuda ofrecida hasta el momento

Por pezweb

13 de clabLevel



 

Flash Developer

chrome
Citar            
MensajeEscrito el 04 Sep 2012 03:24 pm
La clase que haz linkadeo al MC del caldero es donde debes llevar el contador. Esa clase, la del caldero, es la que tiene la variable pública o se subscribe a los eventos de los elementos drageados. No se a que te refieres con clase externa ... ¿externa a que? En líneas generales, so vas a hacer juegos y vas a usar clases, dedícale un tiempo a entender esto sino te meterás casi inmediatamente en problemas difíciles de resolver

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Sep 2012 03:34 pm
Gracias por la sugerencia, de hecho este tema del AS3 y la POO no es simple de entender a primeras, por eso estoy tratando de hacerlo. Para mí una clase externa es cualquier tipo de programación que no se encuentre directamente en el timeline, es decir, en otro archivo.

Cuando estoy en el timeline y he declarado una instancia para un objeto, en este caso "caldero", desde el timeline puedo escribir caldero.addEventListener(); pero cuando uso archivos de clases ese nombre de instancia no me sirve, dado que el output me indica que no reconoce la variable.

Para suscribirme a los eventos necesito alguna referencia a él y hasta el momento esa simple cuestión me está sacando complicando. No obstante he aclarado muchas cosas gracias a tu ayuda, te agradezco la disposición que has tenido conmigo

Por pezweb

13 de clabLevel



 

Flash Developer

chrome
Citar            
MensajeEscrito el 04 Sep 2012 03:36 pm
Si logro realizarlo, postearé mi solución!

Por pezweb

13 de clabLevel



 

Flash Developer

chrome
Citar            
MensajeEscrito el 04 Sep 2012 03:38 pm
Cuando se empieza con clases y se viene de flash, realmente lo primero que se descubre es que el código se escribe en un archivo externo, pero timeline Vs archivo externo no tiene nada que ver con como funcionan, sino realmente el scope de la clase. El punto que arma esto es ver/no ver, es decir si están o no en el DisplayList, es decir si existen como instancias y si las puedo referenciar. En los juegos es común tener Managers (clases no visuales) que llevan la cuenta de enemigos, héroes, dificultades, etc. No hay externo (el timeline es una metáfora mucho menos relevante que cuando hacemos programacion en línea de tiempo)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Sep 2012 04:36 pm
Saludos, logré realizar el ejercicio usando un eventDispatcher para comunicar los eventos entre clases usando una clase intermedia personalizada Clasedispatcher que sirvió de puente entre ambas. Agradezco la ayuda Jorge has sido muy amable.

Por pezweb

13 de clabLevel



 

Flash Developer

chrome
Citar            
MensajeEscrito el 04 Sep 2012 04:38 pm
comparte las clases

ObjetoArrastrable

Código ActionScript :

package net.dnddigital.dragdrop
   {

   import flash.events.Event;
   import flash.events.MouseEvent;
   import flash.display.MovieClip;
   import flash.display.Sprite;
   import flash.geom.Point;
   
   
   public class ObjetoArrastrable extends Sprite 
   {
      
      
      
      protected var posicionOriginal:Point;
      private var dispatcher:ClaseDispatcher;
      
      public function ObjetoArrastrable() 
      {
         posicionOriginal=new Point(x,y);
         buttonMode=true;
         addEventListener(MouseEvent.MOUSE_DOWN, down);
         
             
                     
      }
      
      
         
         
       
                  
                     
      protected function volverAlInicio():void 
      {
         x=posicionOriginal.x;
         y=posicionOriginal.y;
      }
      
      protected function down(event:MouseEvent):void 
      {

         parent.addChild(this);
         startDrag();
         stage.addEventListener(MouseEvent.MOUSE_UP, stageUp);
         

                  
      }
      

      
      public function stageUp(event:MouseEvent):void {
         
         stage.removeEventListener(MouseEvent.MOUSE_UP, stageUp);
         stopDrag();
                            
         //Si hay algo donde caer
         if(dropTarget)
         {
                     
            //si hay algo donde caer, y se llama caldero
            if (dropTarget.parent.name  == "caldero") 
            
            {
               dispatcher = ClaseDispatcher.getInstancia();
                   dispatcher.dispatchEvent(new Event(ClaseDispatcher.CLASEA_CLICK));
               dropTarget.parent.name == "caldero"
               y = stage.stageHeight-height+500;
               buttonMode=false;
                              
            }   
               
               //Si no cae en el caldero, volver al punto inicial
            else
            {
               volverAlInicio();
            }
            
            
            
            
         }
         
         
         
         else
         //Si caes sobre el stage, volver hacia atrás
         {
            volverAlInicio();
         }
         
      }
      
      public function listo():void
      {
         trace("listo");
      }

   }
}















































/*public function contadores():void
      {
         
               trace("completado el drag");
               
               
               contador++;
               trace(contador);
               
               if (contador==3) 
                     
               {
                        trace("ahora");
                        MovieClip(this.parent).gotoAndStop(3);
                        removeEventListener(MouseEvent.MOUSE_DOWN, down);
                        stage.removeEventListener(MouseEvent.MOUSE_UP, stageUp);
               }
         
         
      }   */




Clase Caldero_mc

Código ActionScript :

package net.dnddigital.dragdrop
   {
      
      import flash.events.Event;
      import flash.display.*;
      import flash.events.MouseEvent;
      
      
      public class Caldero_mc extends Sprite
      
      {
         private var dispatcher:ClaseDispatcher;
         public var contador:int = 0;
         
         public function Caldero_mc():void
         {
             dispatcher = ClaseDispatcher.getInstancia();
               dispatcher.addEventListener(ClaseDispatcher.CLASEA_CLICK, detectaEvento);
         }
         
         private function detectaEvento(e:Event):void
            {
                  trace("Detecto el ClaseA click ASDASDASD");
               contador++;
               trace(contador);
            }
         
         
         
         
      }
      
   }




Clase Dispatcher

Código ActionScript :

package net.dnddigital.dragdrop
{
   import flash.events.EventDispatcher;
   //
   public class ClaseDispatcher extends EventDispatcher
   {
      private static var _instancia:ClaseDispatcher;
      public static  const CLASEA_CLICK:String = "onClick_en_claseA";
      //
      public function ClaseDispatcher(s:Singleton)
      {
      }
      public static function getInstancia():ClaseDispatcher
      {
         if (_instancia == null) {
            ClaseDispatcher._instancia = new ClaseDispatcher(new Singleton);
         }
         return _instancia;
      }
   }
}
class Singleton
{
}

Por pezweb

13 de clabLevel



 

Flash Developer

chrome
Citar            
MensajeEscrito el 04 Sep 2012 05:37 pm
Bien. Hacer un Singleton enforcer para un EventDispatcher quizás sea un poco rebuscado en este punto, dado que Sprite extiende EventDispatcher, puedes usar directamente dispatchEvent sin necesidad de usar composición en Caldero. Es bastante común cuando se comienza con OOP "sobrearquitecturar", pero a veces, menos es mas ;)

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.