Comunidad de diseño web y desarrollo en internet online

Clase para arrastrar y soltar varias imágenes en un punto concreto

Citar            
MensajeEscrito el 25 Mar 2011 12:43 am
Hola, estoy haciendo una clase que me permita arrastrar y colocar en el lugar correspondiente unas imágemes, va a ser un juego donde se tengan que colocar 10 imagenes (que por el momento serán fijas, aunque después intentaré que sean 10 imágenes se carguen aleatoriamente dentro de una base de imágenes).
Por un lado tengo en el .fla definidos 10 MovieClip que son simplemente un cuadrado colocados en la posición exacta donde tendremos que ir depositando las imágenes en su lugar correcto.
Además tengo los 10 movieClip cargados con las 10 imágenes.

El problema es a la hora de parar, es decir, dentro de la función soltar, no hay manera de que entre en el if porque la variable myTarget siempre es null; myTarget= getChildByName(myTargetName); no encuentra el movieclip que coindide con el nombre y que es donde tiene que hacer el stop.

El código es el siguiente, no entiendo que hago mal y porque no funciona el getChildByName:

Código ActionScript :

package {
   import flash.display.Sprite;
   import flash.display.DisplayObject;
   import flash.events.MouseEvent;
   import flash.geom.Point;
   import flash.display.*;
    import flash.events.*;
   
   public class MoverAlimentos extends Sprite {      
      public var clip:MovieClip = new MovieClip();
      public var startX:Number;
       public var startY:Number;
       public var counter:Number = 0;
      public var myTarget:DisplayObject;
      
      public function MoverAlimentos(queAlimento){
         clip=queAlimento;
         trace("clip:"+clip.name);
         clip.addEventListener(MouseEvent.MOUSE_DOWN, arrastrar);
          clip.addEventListener(MouseEvent.MOUSE_UP, soltar);
          clip.buttonMode=true;
      }
      
      private function arrastrar(event:Event):void {
                     clip.startDrag();
          //clip.parent.addChild(clip);             
          startX = event.target.x;             
                  startY = event.target.y;             
                  }
       
       private function soltar(event:Event):void {
         clip.stopDrag();
         var myTargetName:String = "target" + event.target.name;
         myTarget= getChildByName(myTargetName);
         trace("myTarget:"+myTarget);
         if (event.target.dropTarget != null && event.target.dropTarget.parent == myTarget){         
            trace("entro en el if");
            event.target.removeEventListener(MouseEvent.MOUSE_DOWN, arrastrar);
            event.target.removeEventListener(MouseEvent.MOUSE_UP, soltar);
            event.target.buttonMode = false;
            event.target.x = myTarget.x;
            event.target.y = myTarget.y;
            counter++;
         } else {            
            event.target.x = startX;
            event.target.y = startY;
         }

   }
   
}


En el fichero .fla incluyo esto para llamar a la función.

Código ActionScript :

import MoverAlimentos;

var ali0:MoverAlimentos=new MoverAlimentos(mc0);

var ali0:MoverAlimentos=new MoverAlimentos(mc1);

var ali0:MoverAlimentos=new MoverAlimentos(mc2);

var ali0:MoverAlimentos=new MoverAlimentos(mc3);



Alguien me puede decir que estoy haciendo mal, por que no funciona, alguna idea de como hacerlo?
Es que no se como acceder a los MovieClip o botones creados en el .fla de manera gráfica para ser utilizados en la clase o a la inversa, utilizar valores de las clases en el código del .fla.
Alguien me puede ayudar, por favor?? Gracias
Saludos

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Mar 2011 08:24 am
Nada no hay manera de que entre en el if de la función soltar, ahora veo que si que reconoce los MovieClip que hay definidos en la escena, pero en myTarget no consigue ningún valor, no me reconoce el DisplayObject, siempre devuelve null, y por eso no se coloca la imagen al soltarla
var myTarget:DisplayObject= getChildByName(myTargetName);

Cómo lo puedo hacer?Alguna idea??

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Mar 2011 09:53 am
La idea es que "myTargetName" no tiene el valor adecuado (eso es porque la propiedad "name" de tus MCs "draguables" no es la que tú crees.
en CS.4 la propiedad "name" no tiene nada que ver con el nombre de instancia ni de la clase. se lo tenemos que dar nosotros a mano

Código ActionScript :

var ali0:MoverAlimentos=new MoverAlimentos(mc0); 
ali0.name="MI NOMBRE"

Por otra parte nome gusta que inicialices la variable "clip" con new Movieclip,

Código ActionScript :

var clip:MovieClip=nul; //mejor que var clip:MovieClip=new MovieClip()


Hay también "algo extraño". Si definimos un clase, podemos asignar esa clase como "clase base" a cualquier MovieClip. Esto lo explica muy bien Esedeerre

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Mar 2011 10:17 am
Esta linea no tiene mucho sentido:

Código ActionScript :

var myTarget:DisplayObject= getChildByName(myTargetName);

porque la clase no tiene ningun 'hijo' que se llame 'targetali0' por ejemplo.

Prueba cambiando por clip.parent.getChildByName... ya que clip existe en tu escenario, tu escenario es el padre de dicho clip y tambien es el padre de cualquier clip en la escena.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 28 Mar 2011 11:52 am
Muchas gracias por responder tan rápido, me ha funcionado como dice Acreonte.

Ahora me ha surgido otra duda, como puedo acceder a una variable text (campo de texto dinámico) que me vaya diciendo si es correcto la imagen donde la coloco o no y por otro lado un contador que me indique los mc que llevo para dar el final. Esto trabajando directamente en el .fla no tenia problemas pero al querer separalo en clases me estoy liando mucho... Si yo defino el campo de texto dinámico luego puedo acceder de alguna forma en la clase??
gracias de nuevo por la ayuda, alguna idea??

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Mar 2011 01:00 pm
Para acceder a cualquier cosa en el escenario puedes usar lo mismo que te comente, clip.parent.nombreDeInstanciaDelTexto.
No es aconsejable el camino que has tomado. Te aconsejo estudiar un poco el patron MVC.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 28 Mar 2011 03:28 pm
No me funciona el texto dinámico definido en el .fla , llamandolo en la clase como tu me dices.

Si que he utilizado el MVC en otras ocasiones con PHP, pero ahora quiero desarrollar un pequeño juego con FlashCS3 y es nuevo para mi, por eso no sabría como aplicar aquí el MVC. Cualquier idea o ejemplo me ayudaría... ahora tengo que cargar varias imágenes desde un fichero para aplicar mi clase MoverAlimentos y se me esta complicando mucho.
De todas formas gracias por la idea, sigo mirando y si hay alguna idea agradezco cualquier ayuda...

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Mar 2011 03:32 pm
tu campo de texto dinamico debe tener nombre de instancia, no nombre de variable. Prueba escribiendo en el fotograma donde se encuentra algo como:

Código ActionScript :

nombreDeInstanciaDeMiTexto.text = 'arrankate miguelito';

funciona?

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 28 Mar 2011 03:41 pm
Si lo llamo en un fotograma si funciona, pero yo quiero llamarlo dentro de la función soltar, ya que según se haya elegido bien o no la imagen aparecerá un mensaje u otro.

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Mar 2011 03:57 pm
De la forma que te mencione debiese funcionar, ej:

Código ActionScript :

clip.parent.nombreDeInstanciaDelTexto.texto = 'algo';

Recuerda que ambas instancias deben estar en el mismo fotograma.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 28 Mar 2011 04:18 pm
No me funciona, lo estoy llamando en soltar como te muestro y lo tengo definido en el mismo fotograma como un texto dinámico.
Me esta pasando lo mismo con el contador que no se donde como llamarlo e inicializarlo..

Código ActionScript :

private function soltar(event:MouseEvent):void {
         clip.stopDrag();
         var myTargetName:String = "target" + clip.name;
         var myTarget:DisplayObject = clip.parent.getChildByName(myTargetName);   
         if (clip.dropTarget != null && clip.dropTarget.parent == myTarget){   
            
            clip.removeEventListener(MouseEvent.MOUSE_DOWN, arrastrar);
            clip.removeEventListener(MouseEvent.MOUSE_UP, soltar);
            clip.buttonMode = false;
            clip.x = myTarget.x;
            clip.y = myTarget.y;
            clip.parent.mitexto.text="Bien";
            //counter++;
            
         } else {            
            clip.parent.mitexto.text="Prueba de nuevo";
            clip.x = startX;
            clip.y = startY;
         }
         if (counter == 4){
               = "Felicidades, has terminado!";
         //   trace("counter vale::"+counter); 
             }         
       }

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Mar 2011 04:28 pm
prueba

Código ActionScript :

var miTexto : TextField = clip.parent.getChildByName('mitexto');

No se si funcione pero vale la pena probar :P

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 28 Mar 2011 04:41 pm
Nada me aparece este error:
1118: Conversión implícita de un valor con tipo estático flash.display:DisplayObject a un tipo flash.text:TextField posiblemente no relacionado.

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Mar 2011 04:49 pm
uh que verguenza! :oops:

Que tal si en vez de eso, disparas un evento diciendo que es lo que ha pasado? la pelicula principal escuchara el evento y reaccionara debidamente. Los eventos son tus amigos ;)

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 28 Mar 2011 05:02 pm
No gracias jeje, mira así si que me funcionó declarándolo primero como DisplayObject:

Código ActionScript :

private function soltar(event:MouseEvent):void {
         var miObjeto : DisplayObject  = clip.parent.getChildByName("mitexto");
         var miTexto: TextField = miObjeto as TextField;
         
         clip.stopDrag();         
         var myTargetName:String = "target" + clip.name;         
         var myTarget:DisplayObject = clip.parent.getChildByName(myTargetName);
               
         if (clip.dropTarget != null && clip.dropTarget.parent == myTarget){         
            clip.removeEventListener(MouseEvent.MOUSE_DOWN, arrastrar);
            clip.removeEventListener(MouseEvent.MOUSE_UP, soltar);
            clip.buttonMode = false;
            clip.x = myTarget.x;
            clip.y = myTarget.y;
            miTexto.text="Bien";
            
            //counter++;
            //trace ("counter ::"+counter);
         } else {                        
            miTexto.text="Prueba de nuevo";            
            clip.x = startX;
            clip.y = startY;
         }
         //if(counter == 2){
              //miTexto.text = "Felicidades, has terminado!";
         //   trace("counter vale::"+counter); 
            // }         
       }


Ahora voy a ver como consigo que funcione el contador según acierta o no para que me salte cuando haya llegado al final...

Por madeline

28 de clabLevel



 

firefox

 

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