AS3从阶段中删除所有子项后,阶段变为空对象?

时间:2012-01-09 19:44:20

标签: flash actionscript-3 cs4

我在AS3文档类中使用了此代码来删除舞台中的所有对象:

var _stage:DisplayObjectContainer = stage as DisplayObjectContainer;
while (_stage.numChildren > 0) {
    _stage.removeChildAt(0);
}

这看起来效果很好,有一个例外。运行之后,可以按下一个按钮将所有内容重新加载到舞台上。在此构造函数中,添加了一些条件以创建舞台的事件侦听器(如果它们尚不存在):

if(!stage.hasEventListener(KeyboardEvent.KEY_DOWN));
    stage.addEventListener(KeyboardEvent.KEY_DOWN, handle_key);
if(!stage.hasEventListener(MouseEvent.MOUSE_MOVE));
    stage.addEventListener(MouseEvent.MOUSE_MOVE, manage_cursor);   

编辑:阶段肯定是空的,我将if(stage){}放在这部分代码周围,并且在使用阶段的代码中的下一个点出现错误

然而,我在重建时收到错误,TypeError: Error #1009: Cannot access a property or method of a null object reference.引用了“stage”。

进一步的研究表明,从阶段中删除所有DisplayObject可能会删除访问阶段本身的能力,直到添加DisplayObject为止。但是,这对我来说没有任何意义,我并不完全确定如何继续。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

如果从MovieClip中调用“stage”,则当MovieClip在显示列表中时,引用将仅为非null。加载Flash后,舞台始终存在,但是当从显示列表中添加/删除单个MovieClip实例时,它们可以获得/失去对它的引用。

这甚至适用于您的文档根实例。只要从显示列表中删除任何DisplayObject,其“阶段引用”就会设置为null。

以下是使用说明概念的根文档的示例:

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    [SWF(width="800", height="600", frameRate="60"]
    public class Main extends Sprite
    {
        public function Main()
        {
            addEventListener(Event.ENTER_FRAME, onEnterFrame, false, 0, true);
        }

        private function onEnterFrame(event:Event):void
        {
            if (stage != null)
            {
                trace("stage: "+stage);
                stage.removeChild(this);
                trace("stage: "+stage);

               removeEventListener(Event.ENTER_FRAME, onEnterFrame);
            }
        }
    }
}

此代码将输出:

stage: [object Stage]
stage: null

请注意从显示列表中删除对象后丢失阶段参考。

在您的示例中,您循环遍历舞台的每个孩子,并删除每个孩子。由于与上面显示的概念相同,这肯定会导致您的舞台参考丢失。