AS3 addChild()。堆栈溢出错误

时间:2012-01-10 16:47:44

标签: actionscript-3 addchild

我遇到了类中的addChild()问题。

我有一个 Ball 类:

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导出的库中的movieClip。

我将它添加到主要内容中:

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

图像加载得很好,我可以在屏幕上看到它。但是我得到了堆栈溢出错误。一切似乎都很好......所以我无法弄清问题是什么。

编辑:如果我将addChild()移动到 Ball 的构造函数,则错误消失。还是不知道那是什么意思。为什么我不能在加载时添加它?

2 个答案:

答案 0 :(得分:3)

只要将对象或其任何子对象添加到显示列表中,

Event.ADDED就会触发。所以当你添加Ball时它会触发一次,然后每次向Ball添加一个新的BallImage时都会递归触发。

修复:
在beginClass函数的开头删除事件侦听器,或者使用Event.ADDED_TO_STAGE代替(在触发后你也应该删除侦听器)。

如果您不需要专门监听这些事件,您也可以直接从构造函数中调用beginClass并完全绕过事件。

答案 1 :(得分:1)

问题是你永远不会清理你的事件监听器。

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

当您添加BallImage时,它会再次触发Event.ADDED事件,因此您需要在添加其他内容之前删除该侦听器。