如何从 AS3 中的场景中删除所有影片剪辑、精灵和图形?
我有一个场景,其中包括所有 MovieClip、Sprites 和图形,我使用 addChild(...) 将其中一些带到舞台上。
我想删除所有这些,因为当我转到其他场景时仍然可以看到它们。
我使用了以下代码,但它显示了下面提到的错误:
btn.addEventListener(MouseEvent.CLICK,removing);
function removing(e:MouseEvent):void
{
while (stage.numChildren > 0)
{
stage.removeChildAt(0);
}
}
错误:
TypeError:错误 #1009:无法访问空对象引用的属性或方法。 在 Show_fla::MainTimeline/removing()
提前感谢您的时间和帮助!
正如它所示,它不能与 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);
}
}
仅当给定的 DisplayObject 实际附加到舞台时,才会定义属性 DiaplayObject.stage。一旦您删除了包含删除代码的 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);
}
}
如果您添加要删除的对象的踪迹,您将看到您删除了 [object MainTimeline],因此您甚至不需要循环。
在您的代码中,您删除了 [object MainTimeline],并且所有剪辑都将被删除。 在 while 循环中,它会引发 for 循环中没有的错误。
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]
因此,您删除了对象 [object MainTimeline],并且没有其他子项可删除。
function removing(e:MouseEvent):void {
trace("removing : " + (stage.getChildAt(0)));
stage.removeChildAt(0);
}
可能会给您相同的输出:
removing : [object MainTimeline]
因此,如果删除了 [object MainTimeline],您甚至不需要循环。
我没有在相同条件下进行测试,因此如果您有相同的输出,请告诉我们。
我建议您查看@LukeVanIn 的答案,其中解释了 阶段、根时间线和主时间线之间的区别
[EDIT]
function removingWhile(e:MouseEvent):void {
while (stage.numChildren > 0){
count++;
trace("removing : " + (stage.getChildAt(0)));
trace ("number of iterations = " + (count++).toString())
stage.removeChildAt(0);
}
}
将输出:
删除:[object MainTimeline] 迭代次数 = 1
TypeError:错误 #1009... 在 Untitled_fla::MainTimeline/removingWhile()
[/EDIT]