Comunidad de diseño web y desarrollo en internet online

Duda con Delegate

Citar            
MensajeEscrito el 22 May 2009 07:22 pm
hola,
Ando practicando con las clases para familiarizarme mas con ellas. Podría solucionar este asunto con AS1, pero me gusta hacer las cosas bien :)
Estoy utilizando Delegate para hacer un menú con clases (son tres opciones de menú). La cuestión es que no consigo que me reconozca cada opción de menú, es decir, sí que reconoce la funcion incluida en delegate, pero siempre me hace el rollover (o cualquier otra función que aplique) con el mismo elemento. Mirando tutoriales, la única diferencia que encuentro con mi programación es que mis opciones de Menú son MovieClips que están en el escenario en lugar de crearlos con attachmovie o createMovieClip.

Dicho esto, por qué no funciona bien?. Aquí está mi código:

class clases.EventosMenuPrincipal extends MovieClip {
///// PROPIEDADES
private var _ruta:MovieClip;
private var _mc:MovieClip;
private var botonesMenu:Array = new Array ("trabajos_mc", "servicios_mc", "equipo_mc"); /// nombre de los movieClips de mi menu
/////////////////////////////////////////////////
function EventosMenuPrincipal (ruta:MovieClip) {
_ruta = ruta; /// para mantener el ámbito de la clase

private function botones () {
for (var i:Number = 0; i < botonesMenu.length; i++) {
_mc = _ruta[botonesMenu[i]]; /// siendo _ruta una referencia de ámbito
_mc.onRollOver = Delegate.create(this, mouse_over);
}
}

private function mouse_over () {
trace (_mc)
_mc.txt.gotoAndPlay("roll"); //// funciona pero siempre con la misma instancia
}
}

y en la linea de tiempo tengo
var Eventos:EventosMenuPrincipal = new EventosMenuPrincipal (this);

por qué no funciona? deben ser movieClips generados en programación? no pueden estar en el stage inicialmente?

muchas gracias,
mig

Por mig

16 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 May 2009 12:58 am
Primero que todo dentro del construcor de la clase has insertado una función botones, esto es un error.
Por otro lado lo que te sucede es que la variable _mc es generada en tiempo de ejecución, esta variable toma varios valores y se queda con el último valor "equipo_mc", cuando ejecutas la acción del mc la acción siempre se realizara sobre este clip, lo que debes hacer es pasar el movieClip al que se le ha asignado la acción como parámetro, algo como esto:

Código ActionScript :

import mx.utils.Delegate;

class clases.EventosMenuPrincipal extends MovieClip {
   ///// PROPIEDADES
   private var _ruta:MovieClip;
   private var _mc:MovieClip;

   private var botonesMenu:Array = new Array("trabajos_mc", "servicios_mc", "equipo_mc");/// nombre de los movieClips de mi menu
   /////////////////////////////////////////////////
   function EventosMenuPrincipal(ruta:MovieClip) {
      _ruta = ruta;/// para mantener el ámbito de la clase
      
      var fn:Function;
      
      for (var i:Number = 0; i<botonesMenu.length; i++) {
         _mc = _ruta[botonesMenu[i]];/// siendo _ruta una referencia de ámbito
         fn =_mc.onRollOver = Delegate.create(this, mouse_over);
         fn.movie = _mc;
      }

   }
   
   private function mouse_over() {
      trace(arguments.caller.movie);
      MovieClip(arguments.caller.movie).txt.gotoAndPlay("roll");
   }
}

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 25 May 2009 10:40 am
muchas gracias elchininet, funciona perfectamente...

Te comento que la función "botones" no la tengo dentro del constructor, simplemente copié mal el código ya que elimine otras funcionalidades y no me di cuenta al copiar aquí...
Ya hablando de todo, me parece muy limpia la solución de pasar parámetros... pero seguramente entonces no necesito un DELEGATE ya que también puedo pasar una función como propiedad de la clase y despues lanzar esa funcion en el rollover... (esto ya lo hice en otras aplicaciones)
Hay alguna diferencia? funciona mejor con Delegate
muchas gracias por tu ayuda
mig

Por mig

16 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 May 2009 11:01 pm
Puedes hacerlo como mejor te convenga, delegate en AS2 sólo te da más flexibilidad para acceder a variables que quedarían fuera de tu alcance con una función simple aplicada a tus movieClip dentro de la clase, lee este post para que comprendas.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 26 May 2009 09:29 am
si, es cierto que hay mas flexibilidad con Delegate...
muchas gracias de nuevo,
mig

Por mig

16 de clabLevel



 

firefox

 

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