1

我在我的 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.“阶段”的错误。

进一步的研究表明,从舞台中删除所有 DisplayObject 可能会删除在添加 DisplayObject 之前访问舞台本身的能力。但是,这对我没有任何意义,我不完全确定如何继续。

任何帮助将不胜感激。

4

1 回答 1

2

如果您从 MovieClip 中调用“stage”,则仅当 MovieClip 在显示列表中时引用才会为非空。一旦加载 Flash,Stage 就始终存在,但是当从显示列表中添加/删除单个 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

请注意从显示列表中删除对象后舞台参考的丢失。

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

于 2012-01-09T22:01:11.563 回答