Comunidad de diseño web y desarrollo en internet online

Remover el Listener de una función con multiples parametros

Citar            
MensajeEscrito el 20 Ago 2009 05:46 am
Bueno tengo mi code, que sirve para colocar o mas bien agregar un addChild en un determinado fotograma de mi codigo:

Ahora bien agrego el EventListener hasta encontrar el fotograma y una vez encontrado elimino el Listener.

Ya lo he hecho antes pero siempre ha sido sencillo es decir algo como:

En el movie clip agrego el listener:

Código ActionScript :

sM.addEventListener(Event.ENTER_FRAME,showTime);


Luego la función que lo ejecuta:

Código ActionScript :

public function showTime(event:Event) {
         var intCurrFrame = Math.round(sM.currentFrame);
         trace(intCurrFrame);
         if (intCurrFrame == 105) {
            showButtons();
            removeEventListener(Event.ENTER_FRAME,showTime);
         }
      }

:cool:
Ahora bien como lo ocupo varias veces pense en hacer una función que recibiera mas parametros para colocar en una posición determinada mis elemento y ademas el Mc Padre en el cual se colocarán los elementos:

Código ActionScript :

uniMC.addEventListener(Event.ENTER_FRAME,function(){showTime3(event,330.3,371.4,480.4,uniMC)});                              


Y luego la función (Sin error, ni warning nada):

Código ActionScript :

public function showTime3(event:Event,xP:Number,yP:Number,xP2:Number,fatMC:MovieClip){
         var intCurrFrame3 = Math.round(fatMC.currentFrame);
               trace(intCurrFrame3);      
               
               if(intCurrFrame3 == 35){                                    
                  buttonsMovements(xP,yP,xP2,fatMC);
                  removeEventListener(Event.ENTER_FRAME,showTime3);                  
                  trace("Funciono! "+(i++));                        
                  }
               }


Todo lo hace bien!, pero no quita el Event listener, ya probe colocando el MC ..algo como fatMC.remove... etc
Y muchas mas cosas que se me ocurrieron pero no encuentro el por que no lo retira, quiero pensar que tiene que ver con el paso de parametros, pero aun asi, al colocar el hasEventListener dentro de la función pareciera no tenerlo y por ende no puede removerse, pero el contador de Funciono! sigue aumentando es decir que sigue entrando aun cuando al condición es especifica, y al llegar a ese frame se sigue imprimiendo el 35 y aumentando el contador. Pero no se ha removido el EventListener.

Alguien sabe que estoy haciendo mal?
Muchas gracias por las respuestas ^^

Pd. Tambien intente eliminando event:Event tanto del addListener como de la función que reciba 4 parametros y no 5 pero aun así no funciona! u.u

Por Evanfallen

31 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Ago 2009 06:17 am
Lo que estás haciendo mal es que el listener NO se está haciendo sobre la función showTime3, sino sobre una función "sin nombre". La solución pasa por crear "eventos personalizados", tal y como muestra Otaku en este tip, o Rich Supe y Zevan Rosser en su blog
Aviso que parece un poco "enrevesado", pero es la mejor forma de hacerlo.

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Ago 2009 07:21 am

Eliseo2 escribió:

Lo que estás haciendo mal es que el listener NO se está haciendo sobre la función showTime3, sino sobre una función "sin nombre". La solución pasa por crear "eventos personalizados", tal y como muestra Otaku en este tip, o Rich Supe y Zevan Rosser en su blog
Aviso que parece un poco "enrevesado", pero es la mejor forma de hacerlo.


Hum si ya habia visto eso antes pero si ta raro :P
Pero si me recomiendas, leere a ver si lo puedo implementar.

Yo me he estado basando en una pagina en la que confio mucho y al menos la función si hace lo que necesito obviamente no se por que no se muere el listener :cry: Aki ta la web

Por Evanfallen

31 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Ago 2009 09:33 am
Es que el listener NO se muere porque estás usando una "función anónima", esto es, una función de la que no sabemos el nombre. Técnicamente es como si escribieras

Código ActionScript :

uniMC.addEventListener(Event.ENTER_FRAME,funcionAnonima)
function funcionAnonima(e:Event){
      showTime3(e,330.3,371.4,480.4,e.target);
};

Luego el removeListener lo tendríamos que hacer como

Código ActionScript :

uniMC.removeEventListener(Event.ENTER_FRAME,funcionAnonima)

Lo que pasa es que NO sabemos el nombre de la función.

Si te parece muy lioso lo de los "eventos personalizados" coincido contigo. Si quieres, toda vez que estamos trabajando con un MC, podríamos escribir(*)

Código ActionScript :

//le damos valor a una propiedad ("datos") del MC
uniMC.datos={dato1:330.3,dato2:371.4,dato3:480.4};
uniMC.addEventListener(Event.ENTER_FRAME,showTime)
//en la función showTime
function showTime(e:Event){
    //uso una variable auxiliar y le igualo a e.target diciendo que es de tipo MovieClip
    var mc:MovieClip=e.target as MovieClip
    //y puedo usar
   mc.datos.dato1, mc.datos.dato2, ..... que darán los valores 330.3, 371,....
}

NOTA: Esedeerre, también está entre mis favoritos :)
(*)Si fuera un objeto de una Clase "ClaseA" que no sea MovieClip o "extienda de MovieClip", deberíamos declarar la variable datos como pública y hacer la "conversión de cast" de dentro de la función como

Código ActionScript :

var mc:ClaseA=e.target as ClaseA

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Ago 2009 05:54 pm
Wooooo!!
Thanks ahora entiendo por que no moria!! :D Muchas gracias eres muy amable, ahorita voy a empezar a trabajar y veré que sucede!!

Por Evanfallen

31 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Ago 2009 01:47 am
Puff :cool:

Bueno he encontrado entre todas las busquedas una clase creada para estos eventos desafortunados! Pero que es muy util la verdad. Aki

Por Evanfallen

31 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Ago 2009 06:06 am
Juas ya quedo!!!

Bueno explico para que si alguien en el futuro lo necesita ya lo tenga todo xd
Ya con el poste anterior podía pasar parámetros implementando una nueva clase, que un poco extraña pero funciona del o mejor, el problema también se presentaba al remover el listener de nueva cuenta, lo que se soluciona con:

Crear una variable función:

Código ActionScript :

private var _callShowT:Function;


Luego donde se implementa el listener, meterle ahí los parámetros utilizando la classe que importamos
(En mi caso mando el MC padre, y el # del frame donde se debe detener).

Código ActionScript :

_callShowT=Callback.create(showTime,sM,105);
addEventListener(Event.ENTER_FRAME,_callShowT);:


Y en la función:

Código ActionScript :

public function showTime(event:Event,uMC:MovieClip,frameStop:uint) {

         var intCurrFrame = Math.round(uMC.currentFrame);
         trace(intCurrFrame);
         if (intCurrFrame == frameStop) {
            showButtons();  
            removeEventListener(Event.ENTER_FRAME,_callShowT);   
         }
      }


Y con eso se elimina sin problemas.

:? Ahora bien un detalle mas existe la forma de pasar una función como parámetro? O es demasiado raro ?
Es que en donde esta el comentario, al llegar al frame deseado me ejecuta lo de la función showButtons, pero que tal si necesito ejecutar otra función que no sea esa?
:shock:

Como se puede hacer??


Pd. La clase usada es la siguiente, tal como esta aun que se vea rara:

Código ActionScript :

// (c) 2007 Ian Thomas
// Freely usable in whatever way you like, as long as it's attributed.
package net.wildwinter{
public class Callback{
       // Create a wrapper for a callback function.
       // Tacks the additional args on to any args normally passed to the callback.
public static function create(handler:Function,...args):Function{
          return function(...innerArgs):void{ handler.apply(this,innerArgs.concat(args));
            }
        }
   }
}

Por Evanfallen

31 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Ene 2010 12:19 pm
ya se q el post es viejo, pero por si a alguien le sirve...

se puede pasar una funcion a otra, de la siguiente manera

var func:Function = function ()
{
trace ("funcion parametro");
}

function otra (f:Function)
{
//llamar la funcion anterior
trace ("funcion padre");
f ();
}

otra (func);

//salida :
/*
funcion padre
funcion parametro
*/

si se necesita ademas pasarle parametros a "func" se puede hacer de la siguiente manera:

function hija (salida:String)
{
trace ("funcion hija :");
trace (salida);
}

function padre (mensaje:String,hija:Function)
{
trace ("funcion padre");
trace ("pasando parametro");

hija (mensaje);
}

esto tambien sirve para pasar funciones para listeners, el problema es q si se quiere usar removeEventListener mas tarde, se debe almacenar la funcion q se utilizo como listener para cada objeto

Por voices

43 de clabLevel



 

chrome

 

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