Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash AS3从stage中删除所有子级后,stage是否成为空对象?_Flash_Actionscript 3_Cs4 - Fatal编程技术网

Flash AS3从stage中删除所有子级后,stage是否成为空对象?

Flash AS3从stage中删除所有子级后,stage是否成为空对象?,flash,actionscript-3,cs4,Flash,Actionscript 3,Cs4,我在我的AS3文档类中使用了以下代码来从后台删除所有对象: var _stage:DisplayObjectContainer = stage as DisplayObjectContainer; while (_stage.numChildren > 0) { _stage.removeChildAt(0); } 除了一个例外,这似乎工作得很好。在我运行这个之后,可以按下一个按钮将所有内容重新加载到舞台上。在此构造函数中,添加了一些条件,以创建阶段的事件侦听器(如果它们不存在)

我在我的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);   
EDIT:stage肯定是空的,我把
if(stage){}
放在这段代码的周围,错误出现在使用该stage的代码的下一点上

但是,在重构时,我收到一个错误,
TypeError:error#1009:无法访问空对象引用的属性或方法。
引用“stage”

进一步的研究表明,在添加DisplayObject之前,从stage中删除所有DisplayObject可能会删除访问stage本身的能力。然而,这对我来说毫无意义,我也不完全确定如何继续

非常感谢您的帮助。

如果您从MovieClip中调用“stage”,则只有当MovieClip在显示列表中时,引用才会为非空。加载Flash后,阶段始终存在,但单个MovieClip实例在从显示列表中添加/删除时可能会获得/失去对它的引用

这甚至适用于文档根实例。一旦从显示列表中删除任何DisplayObject,其“stage”引用将设置为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
请注意,从显示列表中删除对象后,阶段引用将丢失


在您的示例中,您正在对阶段的每个子级进行循环,并删除每个子级。由于上述相同的概念,这肯定会导致您的阶段引用丢失。

您是否可以发布更多的代码?听起来很奇怪。如果stage为null,如何向其添加另一个DisplayObject?如果从MovieClip中调用“stage”,则只有当MovieClip位于显示列表上时,引用才会为非null。你确定事情不是这样吗?加载Flash后阶段始终存在,但单个MovieClip实例在从显示列表中添加/删除时可能会获得/失去对它的引用。这是文档类对
阶段的引用,而不是MovieClip类的引用,所以我不确定它怎么可能失去访问权…@jonathanhedborg我没有向它添加另一个DisplayObject,我根本无法访问它,这就是为什么我一开始就感到困惑。我想不出还有什么比这更具体的代码了。该文件有500行注释不好、结构不好的代码,因此将整个文件放在一起可能对任何人都没有用处。除非它将“KeyboardEvent.KEY\u DOWN”引用为空对象引用,这可能更没有意义。我一直在尝试放置类似于
if(\u stage.getChildAt(0)!=this)的内容
在while循环内和
removeChildAt
周围,但是当我这样做时,flash只是突然出现如果我将
而numChildren>0
更改为
而numChildren>1
并执行
removeChildAt(1)
而不是
removeChildAt(0)
,它有效地解决了我的问题。我猜舞台将是展示列表上的第一个孩子,因为事实证明我是对的。这是一种稳定的处理方法吗?这样做安全吗?虽然假设您的根文档类始终是该阶段的第一个子类可能是安全的,但我会中断一个for循环,而不是一段时间。然后,您的代码将明确地显示它试图完成的任务:
for(int i=stage.numChildren-1;i>=0;i--){if(stage.getChildAt(i)!=this){stage.removeChildAt(i);}}
谢谢您,出于某种原因,这在for循环中工作,而不是while循环。再次感谢!