我有一个包含所有MovieClip,Sprite,图形的场景,我使用addChild(...)将其中一些带到舞台上。
我想删除所有这些,因为当我去其他场景时我仍然可以看到它们。
我使用了以下代码,但它向我显示了下面提到的错误:
btn.addEventListener(MouseEvent.CLICK,removing);
function removing(e:MouseEvent):void
{
while (stage.numChildren > 0)
{
stage.removeChildAt(0);
}
}
错误:
TypeError:错误#1009:无法访问空对象引用的属性或方法。 在Show_fla :: MainTimeline / removed()
提前感谢您的时间和帮助!
答案 0 :(得分:2)
如图所示,它不适用于while循环,它正在使用for循环|:
btn.addEventListener(MouseEvent.CLICK,removing);
function removing(e:MouseEvent):void
{
var i:int = 0;
for (i=stage.numChildren-1; i>=0; i--)
{
stage.removeChildAt(i);
}
}
答案 1 :(得分:1)
属性DiaplayObject.stage仅在给定的DisplayObject实际附加到舞台时定义。一旦删除包含删除代码的Sprite / MovieClip,其.stage将更改为null,并且下一个条件检查stage.numChildren自然会失败。你应该在局部变量中保留stage的引用。
btn.addEventListener(MouseEvent.CLICK,removing);
function removing(e:MouseEvent):void
{
var aStage:Stage = stage;
while (aStage.numChildren > 0)
{
aStage.removeChildAt(0);
}
}
答案 2 :(得分:1)
如果添加要删除的对象的跟踪,您将看到删除[对象MainTimeline],因此您甚至不需要循环。
在您的代码中删除[对象MainTimeline]并删除所有剪辑。 在while循环中,它会在for循环中抛出Error。
function removing(e:MouseEvent):void {
var i:int = 0;
for (i=stage.numChildren-1; i>=0; i--)
{
trace("removing : " + (stage.getChildAt(i)));
stage.removeChildAt(i);
}
}
输出:
removing : [object MainTimeline]
因此,您删除了对象[对象MainTimeline],并且不再有要删除的子项。
function removing(e:MouseEvent):void {
trace("removing : " + (stage.getChildAt(0)));
stage.removeChildAt(0);
}
可能会给你相同的输出:
removing : [object MainTimeline]
所以如果[对象MainTimeline]被移除,你甚至不需要循环。
我没有在相同的条件下测试它,所以请告诉我们你是否有相同的输出。
我建议您查看@LukeVanIn的答案,解释difference between stage, root and main timeline
[编辑]
function removingWhile(e:MouseEvent):void {
while (stage.numChildren > 0){
count++;
trace("removing : " + (stage.getChildAt(0)));
trace ("number of iterations = " + (count++).toString())
stage.removeChildAt(0);
}
}
将输出:
删除:[对象MainTimeline] 迭代次数= 1
TypeError:错误#1009 ...... 在Untitled_fla :: MainTimeline / removedWhile()
[/编辑]