2012-08-27 30 views
5

Estoy haciendo un pequeño juego en as3.Cómo eliminar todos los detectores de eventos a la vez en AS3

El juego contiene 10 niveles.

Cuando ingreso 1 nivel todo está bien. Pero cuando ingreso al segundo nivel (cuadro), los oyentes del evento del primer cuadro siguen funcionando y recibe una advertencia que dice 'No se puede acceder a un objeto de referencia de objeto nulo'. Esto se debe a eliminar todos los objetos del primer nivel y agregar los objetos de la etapa 2.

He intentado utilizar removeEventListeners, pero no funciona, porque los oyentes de ENTER_FRAME funcionan una vez más después de eliminar el evento Oyentes.

He intentado usar diferentes cuadros para diferentes niveles, pero no funciona. También intenté usar 1 frmae para los 10 fotogramas, pero recibí muchas advertencias y Flash Loader está sobrecargado.

¿Cómo puedo cambiar los niveles (hacia adelante y hacia atrás)? Gracias por adelantado.

addEventListener(Event.ENTER_FRAME, subtracting2); 
    arrListeners.pop(); // poping it out of the array because it will be deleted after the count reaches 0 
    function subtracting2 (e:Event):void 
    { 
     count--; 
     var FAcoef:Number = count/30; // 
     FadeAway.alpha = FAcoef; //     Some effect like FadeAway 
     setChildIndex(FadeAway, numChildren - 1); // 
     if(count == 0) 
     { 
      setChildIndex(FadeAway, 0); 
      removeEventListener(Event.ENTER_FRAME, subtracting2); 
     } 
    } 
+0

No puedes. Si no desea molestarlo con eventos (** asíncrono **), intente con [Señales AS3] (https://github.com/robertpenner/as3-signals) (** sincrónico **). – Florent

+4

Quizás no deba agregar escuchas de eventos en un bucle de enterframe ... – Kodiak

+0

Tengo que agregar ENTER_FRAME para verificar si se pasa el nivel y para asegurarme de que las leyes del juego no estén rotas. No tiene que ser mi idea lo que es correcto (con remove EventListeners). Mientras funcione bien, aceptaré cualquier idea – Stefan4024

Respuesta

9

No hay una forma incorporada de eliminar todos los oyentes.

Puede utilizar referencias débiles para dejar que los oyentes se eliminen cuando el objeto es Basura Recopilada.

object.addEventListener (......, ......., falso, 0, verdadero);

O podría añadir la funcionalidad removeAllListeners mismo, he aquí algo de información:
http://blog.reyco1.com/method-of-removing-all-event-listeners/ (Tenga una mirada en comentario Ion)

Pero .. No debería necesitar cualquiera de los anteriores si se cuida a eliminar cada escucha de eventos de inmediato cuando ya no se necesita.

Si tiene una clase con uno o más detectores de eventos que se necesitan hasta el final de la vida de la instancia, debe crear una función destroy(). En esa función destroy() eliminarás todos los oyentes de eventos.

En su caso, puede llamar a destroy() antes de pasar al segundo nivel (cuadro).

+0

Si trato de usar referencia débil y Basura recolectada, ¿cómo puedo eliminar a los oyentes del evento que están conectados al escenario? Y si elimino el objeto, ¿debería llamarlo de nuevo para volver a iniciar el escucha de eventos? – Stefan4024

+0

¿qué quiere decir con "eliminar el objeto"? anulándolo o quitándolo del escenario? –

+0

¿Cómo puedo usar destroy()? Por mucho que sepa destruir no es un método o una función en AS3 – Stefan4024

Cuestiones relacionadas