Comunidad de diseño web y desarrollo en internet online

Drag 'n Drop solo con clases

Citar            
MensajeEscrito el 25 Ene 2007 08:51 pm
Hola a todos, necesito un poco de ayuda al manejar clases y eventos.

Estoy haciendo una animacion que cargará varias piezas muy similares entre si, ademas que cada pieza debe poder ser arrastrada por el usuario (similar a un rompecabezas).

Para esto he creado una clase que se asocia a una imagen (la imagen puede variar), el nombre de la imagen viene como parámetro en el constructor. Lo hice de esta manera porque el comportamiento debe ser el mismo para cada pieza, solo varia la imagen a ser asociada.

La clase que muestro a continuacion, despliega adecuadamente cualquier imagen que se le pase, mi problema es al detectar los eventos del mouse:

Código :

class Pieza extends MovieClip
{
   //atributos
   var angulo:Number;
   var img:MovieClip;
   var numero:Number;
   var seleccionado:Boolean;
   var cara:String;
   

   public function Pieza(rutax:MovieClip, contenedor:String, imgx:String ){
      img  = rutax.createEmptyMovieClip (contenedor, rutax.getNextHighestDepth () )
      img._x = 100;
      img._y = 100;
      img.loadMovie(imgx);
      
      img.onPress   = doDrag; 
              img.onRelease = doDrop;
      
   }
   
   private function doRollOver():Void {
      trace("mouse detectado");
   }


   private function doDrag():Void {
      this.startDrag();
   }

   private function doDrop():Void {
      this.stopDrag();
   } 
   
   public function set_numero(num:Number):Void{
      this.numero = num;
   }
   public function get_numero():Number{
      return this.numero;
   }
   
   public function set_seleccionado(b:Boolean):Void{
      this.seleccionado = b;
   }
   public function get_seleccionado():Boolean{
      return this.seleccionado;
   }
   
   function destroy (){
      img.unloadMovie ()
      img.removeMovieClip ()
   }
   
}


En mi archivo FLA, lo instancio asi:

Código :

var contenedor:Pieza = new Pieza(this, "contenedor", "cabeza.gif");


Intenté sobrecargar los métodos onPress y onRelease, pero tampoco conseguí resultados:

Código :

       private function onPress() {
      startDrag(true);
   }

   private function onRelease() {
      stopDrag();
   } 


En una version anterior, pude mover la pieza asociandolo por medio de la biblioteca, pero eso no me sirve de mucho ya que el número de piezas y la imagen para cada pieza variará de acuerdo al comportamiento del usuario.

Agradezco de antemano cualquier aporte.

Saludos

Por felippe

7 de clabLevel



Genero:Masculino  

opera
Citar            
MensajeEscrito el 25 Ene 2007 09:41 pm
Utiliza la clase Delegate para asignar las funciones:

Código :

import mx.utils.Delegate;
class Pieza extends MovieClip
{
   ........
   public function Pieza(rutax:MovieClip, contenedor:String, imgx:String)
   {
      ........
      img.onPress = Delegate.create(this, doDrag);
      img.onRelease = Delegate.create(this, doDrop);
   }
   .........
   private function doDrag():Void
   {
      img.startDrag();
   }
   private function doDrop():Void
   {
      img.stopDrag();
   }
   ...........
}


Mirate este tip

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 26 Ene 2007 01:58 pm
Gracias por responder Zguillez,

asi de primera, no me funciona lo de la clase Delegate, pero me parece una interesante sugerencia ahora que leo su documentación (aunque no conozco el manejo de componentes en Flash).

Haré algunas pruebas con componentes y la clase Delegate, luego les cuento como va.

Salu2

Por felippe

7 de clabLevel



Genero:Masculino  

opera
Citar            
MensajeEscrito el 26 Ene 2007 02:33 pm
Hmmm, me retracto con lo de componentes, al parecer se puede manejar Delegate sin componentes

sorry.

Por felippe

7 de clabLevel



Genero:Masculino  

opera

 

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