Flash AS3从stage中删除所有子级后,stage是否成为空对象?
我在我的AS3文档类中使用了以下代码来从后台删除所有对象: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); } 除了一个例外,这似乎工作得很好。在我运行这个之后,可以按下一个按钮将所有内容重新加载到舞台上。在此构造函数中,添加了一些条件,以创建阶段的事件侦听器(如果它们不存在)
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循环。再次感谢!