2012-10-30 55 views
0

我有一個加載swf的預加載器,swf創建了一堆偵聽器,對象和影片剪輯。我希望所有這些都被銷燬並重新創建。如何完全刪除加載的swf並重新加載它? (試圖重新啓動遊戲)

簡化我的預加載的版本:

var request:URLRequest = new URLRequest("myfile.swf"); 
var myLoader:Loader = new Loader(); 
var urlLoader:URLLoader = new URLLoader(); 


urlLoader.addEventListener(Event.COMPLETE, function(event){ 
    stage.addChild(myLoader); 
    myLoader.loadBytes(urlLoader.data); 
}); 

urlLoader.dataFormat = URLLoaderDataFormat.BINARY; 
urlLoader.load(request); 

當我嘗試刪除它,我這樣做:

stage.removeChild(myLoader); 
var child = loader.myLoader.content as Object; 
SoundMixer.stopAll(); 
while(stage.numChildren > 0){ 
    stage.removeChildAt(0); 
} 
child.stop(); 
while(stage.numChildren > 0){ 
    stage.removeChildAt(0); 
} 
child=null; 

System.gc(); 
myLoader.unloadAndStop(true); 
System.gc(); 
myLoader.unload(); 
System.gc(); 
myLoader.loadBytes(urlLoader.data); 
stage.addChild(loader.myLoader); 

回答

2

在你加載的SWF可以創建「破壞」,這會消除的方法所有聽衆,銷燬所有對象並重置所有數據。

你可以調用這個方法無論是從父對象(如果該方法是公開的),或者你可以撥打destroy當您從舞臺中刪除SWF(Event.REMOVED_FROM_STAGE)

0

可以重新裝載JS瑞士法郎,這是這樣做的簡單方法。你可以檢查this answer

或者你必須做一個好的對象和監聽器管理和重置SWF文件中的遊戲。隨着項目變大,這可能會變得很複雜。您需要釋放所有引用和偵聽器的方法。

0

首先你應該使用Loader類這樣加載SWF:

var movie:MovieClip 
     var loader:Loader = new Loader(); 
     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
     loader.load(new URLRequest("myfile.swf")); 

     function loadComplete(event:Event):void 
     { 
     movie = loader.content as MovieCLip; 
     addChild(movie); 
     } 


    //when reloading just remove the movie object from the stage 

    removeChild(movie); 
    SoundMixer.stopAll(); 
    //...... 
    //. 
    //. 
0

我知道這是老了,但我無意中發現了它的參考和看到一些東西,我覺得應該提到。 () - 雖然它是一個你可以訪問的函數,但是我見過的所有東西都表明垃圾回收器不應該被你的代碼調用,除非你使用了大量的內存並且需要它回來立即。垃圾收集器通常比它更容易運行(Force Garbage Collection in AS3?)。它不僅會影響您的應用程序的性能,還會影響在該瀏覽器或容器中運行的所有Flash應用程序。

還有很多人努力有效地使用unloadAndStop(),因爲在各種情況下它似乎相當不可靠(Unloading swf using the unloadAndStop() method, but video sounds remain audible)。

爲了徹底,我強烈建議您儘量避免在加載的Flash對象內部使用任何其他語言來刪除所有內容,然後再刪除Flash對象本身,而不是期待容器處理它適合你。這就是爲什麼Flash有開始的內存泄漏的聲譽。

在加載的swf中,添加在卸載時觸發的代碼。 一種方式是把它添加到SWF:

this.addEventListener(Event.REMOVED_FROM_STAGE, doUnload) 

然後讓doUnload functon執行以下操作:

使用removeEventListener有效地終止該事件處理程序。你可以調用你創建的所有addEventListener,或者製作一個例程來遍歷並遍歷遊戲中的對象。第一個選項因爲它是獨佔的,所以效率更高,但理論上第二個選項可以在應用程序之間記憶和複製。

對變量使用delete()使它們可以被垃圾回收器移除。注意:與許多語言不同,除非參考也被刪除,否則參考變量將不可移除。例如:

var a:int = 0; 
var b:int = a; 

delete(a); // b still exists and equals 0, a is not available to GC. 
delete(b); // now both variables can be removed by GC. 

還有仍然混亂,無論是使用removeChildAt(0)或刪除孩子單獨對象是個好主意。第一種方法具有明顯簡單和直接的優點,但這也使得編碼人員無法完全理解這一點,並可能會錯過類似於unloadAndStop()的方法。不如使用removeChild走你的對象樹,並明確地消除事情沒有問題或不確定性。

設置完成後,添加一個函數以卸載Flash對象將觸發其自動刪除,因此加載器將保持簡單和整潔,並重新加載閃存乾淨。