【问题标题】:AS3 addChild(). Stack Overflow errorAS3 addChild()。堆栈溢出错误
【发布时间】:2012-02-07 02:05:53
【问题描述】:

我在使用 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 导出的影片剪辑。

我像这样将它添加到主目录中:

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

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

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

【问题讨论】:

  • BallImage 类中发生了什么?
  • 已编辑(BallImage 是库中的影片剪辑)。
  • 请粘贴堆栈溢出信息
  • * 你能添加一个错误日志吗?
    * 你在场景中添加了多少个球(Ball 类的实例)?
    * 多少个图像(BallImage 类的实例)你加一个球吗?一个球可能有多个图像,因为您没有清除它。
    * 一个图像有多少重量?

标签: actionscript-3 addchild


【解决方案1】:

Event.ADDED 将在对象或其任何子对象添加到显示列表时触发。所以它会在你添加 Ball 时触发一次,然后在每次向 Ball 添加新的 BallImage 时递归触发。

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

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

【讨论】:

  • 另外这个帖子可能有助于理解 ADDED 和 ADDED_TO_STAGE 之间的区别:actionscript.org/forums/showthread.php3?t=220154
  • 就是这样,谢谢。另外,错误是否来自我正在覆盖变量 mc 的事实?
  • 不,错误来自这样一个事实,即 beginClass 函数有效地一遍又一遍地无限调用自身,直到程序崩溃。
【解决方案2】:

问题是你从不清理你的事件监听器。

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

当你添加 BallImage 时,它​​会再次触发 Event.ADDED 事件,所以你需要先移除监听器,然后再添加其他任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2019-02-16
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多