2012-08-27 30 views
5

As3'te küçük bir oyun yapıyorum.AS3'te tüm olay dinleyicileri nasıl silinir

Oyun 10 seviye içeriyor.

1 seviyeye girdiğimde her şey yolunda. Fakat ikinci seviyeye (çerçeve) girdiğimde, ilk çerçeveden olay dinleyicileri hala çalışıyor ve "boş nesne referansı nesnesine erişilemiyor" diyen bir uyarı al. Bunun nedeni, ilk düzeydeki her nesneyi sildiğim ve 2. nesneyi nesneleri eklediğimdir.

removeEventListeners'ı kullanmayı denedim, ancak işe yaramıyor, çünkü ENTER_FRAME Dinleyici, Olayı kaldırdıktan sonra bir kez daha çalışır Dinleyiciler.

Farklı düzeyler için farklı çerçeveler kullanmayı denedim, bit çalışmıyor. Ayrıca tüm 10 kare için 1 frma kullanmayı denedim, ancak çok fazla uyarı alıyorum ve Flash Loader aşırı yüklü.

Seviyeleri nasıl değiştirebilirim (geri ve ileri)? Şimdiden teşekkürler.

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

Yapamazsınız. Olaylarla (** asenkronize **) rahatsız edilmek istemiyorsanız, [AS3 Sinyalleri] 'ni (https://github.com/robertpenner/as3-signals) deneyin (** senkronize **). – Florent

+4

Belki bir enterframe döngüsünde olay dinleyicileri eklememelisiniz ... – Kodiak

+0

Seviyenin geçip geçmediğini kontrol etmek ve oyun kurallarının kırık olmadığından emin olmak için ENTER_FRAME eklemeliyim. Bu fikrin benim fikrimi olmak zorunda değil (EventListeners'ı kaldırmakla). İyi çalışıyorsa, herhangi bir fikri kabul edeceğim – Stefan4024

cevap

9

Tüm dinleyicileri kaldırmak için yerleşik bir yol yoktur.

Nesne Çöp Toplandığında, dinleyicilerin kaldırılmasına izin vermek için zayıf referansları kullanabilirsiniz.

object.addEventListener (......, ......., false, 0, true);
http://blog.reyco1.com/method-of-removing-all-event-listeners/

(İyon comment göz at) Ama özen eğer .. Eğer yukarıdakilerden herhangi gerekmez:

Yoksa removeAllListeners işlevsellik kendiniz ekleyebilir, burada bazı bilgiler verilmiştir Artık gerekmediğinde her olay dinleyiciyi hemen kaldırın.

Örnek yaşamın sonuna kadar gereken bir veya daha fazla olay dinleyicisine sahip bir sınıfınız varsa, bir destroy() işlevi oluşturmalısınız. Bu destroy() işlevinde, tüm olay dinleyicilerini kaldırabilirsiniz.

Sizin durumunuzda, ikinci seviyeye (çerçeve) gitmeden önce destroy() öğesini çağırabilirsiniz.

+0

seviyesini geçmek için belirli miktarda puanınızın olması gereken bir bulmaca oyunudur Zayıf referansı ve Çöp Toplama'yı kullanmayı denerseniz, sahneye bağlı Olay Dinleyicilerini nasıl kaldırabilirim? Ve eğer nesneyi silersem, olay dinleyicisini tekrar başlatmak için tekrar çağırmalı mıyım? – Stefan4024

+0

"Nesneyi silme" ile ne demek istiyorsunuz? nulling veya sahne kaldırılıyor? –

+0

Nasıl destroy() kullanabilirim? Bildiğim kadarıyla yok etme, AS3 – Stefan4024