2012-01-10 53 views
0

我遇到了類addChild()的問題。AS3 addChild()。堆棧溢出錯誤

我有一個類:

package { 
import flash.display.Sprite; 
import flash.display.MovieClip; 
import flash.events.*; 
import Achievement; 
public class Ball extends Sprite { 
    //the image I want to add 
    var mc:MovieClip; 

    public function Ball() { 
     addEventListener(Event.ADDED, beginClass); 
    } 

    private function beginClass(event:Event):void { 
     mc = new BallImage(); 
     addChild(mc); 
    } 

} 
} 

BallImage是一個動畫片段ActionScript導出圖書館。

我把它添加到主這樣的:

import Ball; 
var littleBall:Ball = new Ball(); 
addChild(littleBall); 
littleBall.x=100; 
littleBall.y=100; 

圖像加載就好了,我可以看到它在屏幕上。但是我得到一個堆棧溢出錯誤。一切似乎都工作得很好......所以我無法弄清楚問題所在。

編輯:如果我將addChild()移動到構造函數Ball,錯誤消失。仍然不知道這意味着什麼。爲什麼不能在加載時添加它?

+0

「BallImage」類中發生了什麼? – 2012-01-10 16:52:53

+0

已編輯(BallImage是圖書館中的動畫片段)。 – Skuge 2012-01-10 16:59:14

+0

請粘貼堆棧溢出消息 – 2012-01-10 17:10:25

回答

3

Event.ADDED將隨時將對象或其任何子對象添加到顯示列表中。所以當你添加Ball時它會觸發一次,然後每當你添加一個新的BallImage到Ball時遞歸地發射。

要解決:
無論是在beginClass函數開始刪除事件偵聽器,或者使用Event.ADDED_TO_STAGE替代(你也應該可能移除它觸發後聽衆)。

如果您不特別需要監聽這些事件,那麼也可以直接從構造函數中調用beginClass,並完全繞過這些事件。

+0

此主題也許有助於理解ADDED和ADDED_TO_STAGE之間的區別:http://www.actionscript.org/forums/showthread.php3?t=220154 – Cadin 2012-01-10 17:10:55

+0

這就是它,謝謝。另外,錯誤來自我覆蓋變量mc的事實嗎? – Skuge 2012-01-10 17:15:01

+0

不,這個錯誤來自beginClass函數在程序崩潰之前無休止地無限調用自身的事實。 – Cadin 2012-01-10 17:43:10

1

問題是,你從來沒有清理你的事件監聽器。

private function beginClass(event:Event):void { 
    removeEventListener(Event.ADDED, beginClass); // add this line 
    mc = new BallImage(); 
    addChild(mc); 
} 

當您添加BallImage,將會再次觸發Event.ADDED事件的,所以你需要刪除監聽器添加任何東西之前。