2013-03-03 32 views
0

我創建一個新的Shape,使一個偵聽器在對象觸及形狀時啓動一個函數,該函數清除形狀的圖形,刪除偵聽器並刪除子項。但它看起來像留下了一些幽靈,當我的物體到達它的位置時,它仍然會觸發。我不知道它爲什麼會發生,我認爲清除+刪除應該使它無法擊中測試。但不知怎的,孩子們仍然互相堆砌,最後一個孩子觸發了這個功能。所以,如果你明白了,請給我一個提示,如果不是請一般告訴我什麼是刪除一個創建好的Shape的方法,所以它沒有計算現有的?AS3如何刪除一個好的對象?

一些細節。點擊形狀必須啓動一個函數,刪除它並創建一個具有相同名稱的新形狀,該函數具有相同的功能,所以當前函數必須是我所要求的函數,而不是最後一個函數,其偵聽器I刪除。每次都做出新的形狀可能會使記憶超載,而且我每次都會清理乾淨。我忘記了什麼嗎?

fun0(){ 
    var bob:Shape = new Shape(); 
    addChild(bob); 
    bob...drawRect... 
    addEventListener(...,fun1) 
    function fun1(){ if(hitTest...){ 
    bob...clear(); 
    removeChild(bob); 
    removeEventListener(...,fun1) 
    fun2(); 
    } 
} 


fun2(){ 
    var bob:Shape = new Shape(); 
    addChild(bob); 
    bob...drawRect... 
    addEventListener(...,fun3) 
    function fun1(){ if(hitTest...){ 
    bob...clear(); 
    removeChild(bob); 
    removeEventListener(...,fun3) 
    fun0(); 
    } 
} 

等,它只看到fun3後我曾經觸發它,即使我刪除了偵聽器。同樣,我確實將對象移開,它不再受到測試,然後清除+刪除。如果你不明白或不能幫助,請不要燃燒,忽略這一點,我需要幫助,而不是我沒有你那麼聰明的信息。謝謝。

回答

0

首先不要在函數內聲明函數。然後對事件列表使用弱引用。

// params: eventName, listener, capturePhase, priority, useWeakReference 
someObj.addEventListener("eventName",myFunct,false,0,true); 

你musst擺脫對對象的任何引用,然後將其設置爲null

removeChild(bob); 
bob= null; 

後GC將收集吧!

編輯:

,如果你繼續做則hitTest,像enterFrame事件爲例。通過檢查它的.stage屬性來檢查對象是否在舞臺上。

if(bob.stage) 
    { 
    if(hitTest ...){}; 
    } 
+0

謝謝,但它沒有工作......空做了一些奇怪的代碼,當我回到上一個函數它說錯誤,「hitTestObject參數不應該爲空」。另外,你的意思是我不應該調用函數內的函數?我認爲這是一件平常的事情,我還會如何觸發另一個功能? – SherWood 2013-03-05 12:33:01

+0

不,我說你不應該在另一個裏面聲明一個函數,顯然你會給他們打電話。如果你繼續打擊測試那個對象,如果它首先存在,你就會激起反感,我會更新回答 – M4tchB0X3r 2013-03-05 12:43:27

+0

不,不會。如果我將函數啓動器放在另一個樂趣中,它對函數有點意義。它就像功能的無盡「起始」一樣。但檢查如果bob.stage沒有幫助。而且我確實創造了這種形狀,即使沒有檢查,它也應該找到它。形狀nulling導致錯誤...感謝您嘗試幫助,雖然,這些都是很好的猜測。 – SherWood 2013-03-05 17:54:09