我在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为止。但是,这对我来说没有任何意义,我并不完全确定如何继续。
非常感谢任何帮助。
答案 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
请注意从显示列表中删除对象后丢失阶段参考。
在您的示例中,您循环遍历舞台的每个孩子,并删除每个孩子。由于与上面显示的概念相同,这肯定会导致您的舞台参考丢失。