2012-08-27 13 views
5

Sto facendo una piccola partita in as3.Come eliminare tutti i listener di eventi contemporaneamente in AS3

Il gioco contiene 10 livelli.

Quando inserisco 1 livello, tutto va bene. Ma quando inserisco il secondo livello (frame) i listener di eventi dal primo frame sono ancora funzionanti e ricevo un avviso che dice "Impossibile accedere a un oggetto di riferimento objct null". Questo perché io elimino ogni oggetto del primo livello e aggiungo gli oggetti dal secondo stadio.

Ho provato a usare removeEventListeners, ma non funziona, perché ENTER_FRAME gli ascoltatori funzionano ancora una volta dopo aver rimosso l'evento ascoltatori.

Ho provato a utilizzare diversi frame per diversi livelli, bit non funziona. Inoltre ho provato ad usare 1 frmae per tutti e 10 i frame, ma ricevo molti avvertimenti e il Flash Loader è sovraccarico.

Come posso passare attraverso i livelli (avanti e indietro)? Grazie in anticipo.

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

Non è possibile. Se non vuoi disturbarti con eventi (** asincroni **), prova [Segnali AS3] (https://github.com/robertpenner/as3-signals) (** sincrono **). – Florent

+4

Forse non dovresti aggiungere listener di eventi in un loop di enterframe ... – Kodiak

+0

Devo aggiungere ENTER_FRAME per verificare se il livello è passato e per essere sicuro che le leggi di gioco non siano infranti. Non deve essere la mia idea che è giusto (con rimuovere EventListeners). Finché funziona bene, accetterò qualsiasi idea – Stefan4024

risposta

9

Non esiste un modo integrato per rimuovere tutti i listener.

È possibile utilizzare riferimenti deboli per consentire la rimozione dei listener quando l'oggetto è Garbage Collection.

object.addEventListener (......, ......., false, 0, true);

Oppure si potrebbe aggiungere la funzionalità removeAllListeners da soli, ecco alcune informazioni:
http://blog.reyco1.com/method-of-removing-all-event-listeners/ (Dai un'occhiata alla Ion commento)

Ma .. non dovrebbe essere necessario una di queste, se si prende cura di rimuovere immediatamente ogni ascoltatore di eventi quando non è più necessario.

Se si dispone di una classe con uno o più listener di eventi necessari fino alla fine della vita dell'istanza, è necessario creare una funzione destroy(). In tale funzione destroy() si rimuovono tutti gli ascoltatori di eventi.

Nel tuo caso, puoi chiamare destroy() prima di andare al secondo livello (frame).

+0

Se provo a utilizzare riferimenti deboli e Garbage Collection, come posso rimuovere gli ascoltatori di eventi connessi allo stage? E se cancello l'oggetto, dovrei richiamarlo di nuovo per avviare nuovamente il listener di eventi? – Stefan4024

+0

cosa intendi con "eliminazione dell'oggetto"? annullando o rimuovendo dal palco? –

+0

Come posso usare destroy()? Per quanto ne so distruggere non è il metodo o la funzione in AS3 – Stefan4024

Problemi correlati