我正在使用Flash Actionscript 3.0中的横向滚动游戏。现在我试图让玩家通过触摸某个物体进入下一个级别。在加载下一个级别之前,我尝试从舞台中删除所有以前级别的资源(背景和" floor"),它们是MovieClip。当下一级加载时,我仍然可以看到以前级别的资产,尽管玩家无法与他们交互。
我环顾互联网并尝试了一些方法来解决我的问题,但我无处可去。以下是我用于从一个级别转换到下一个级别的代码。 &#; bgContainer'仅包含已卸载级别的背景MovieClip和' allContainer'包含卸载级别的楼层和其他环境对象。这些容器稍后会加载下一级所需的对象。
// Check if the Player has touched Level 1's end point
private function checkLevel1To2Collision(event:Event):void {
// Has the Player touched Level 1's end point?
if (HitTest.intersects(player, level1To2, this)) {
// Remove Level 1's Background from the stage
//stage.removeChild(bgContainer);
removeEventListener(Event.ENTER_FRAME, scrollScreen);
// Clear everything from the stage (only if there is already something on the stage)
//while (numChildren > 0) {
//for (var stgIndex = 0; stgIndex < stage.numChildren; stgIndex++) {
//stage.removeChildAt(0);
//}
//}
//}
stage.removeChild(allContainer);
stage.removeChild(bgContainer);
// Clear out all elements from the 'allContainer' before reloading the current level
for (var allIndex1:int = 0; allIndex1 < allContainer.numChildren; allIndex1++) {
allContainer.removeChildAt(allIndex1);
//if (stage.getChildAt(allIndex1)) {
//stage.removeChildAt(allIndex1);
//}
}
// Remove the elements within 'bgContainer' from the stage
for (var bgIndex1:int = 0; bgIndex1 < bgContainer.numChildren; bgIndex1++) {
bgContainer.removeChildAt(bgIndex1);
//if (stage.getChildAt(bgIndex1)) {
//stage.removeChildAt(bgIndex1);
//}
}
// Load Level 2
loadLevel2(event);
}
} // End of 'checkLevel1To2Collision' function
可以看出,我已经尝试过至少两种技术来卸载以前级别的资产。我试过通过舞台并逐个删除所有元素,使用&#39; for&#39;环。我已经尝试删除索引0处的stage元素,而舞台上有一个对象。我也试着提到&#39; root&#39;而不是&#39; stage&#39;使用&quot; addChildAt()添加对象。&#39;这些技术都没有奏效。我仍然不知道为什么以前的水平不会被卸载。
任何帮助将不胜感激!
谢谢!
答案 0 :(得分:1)
如果您不确定allContainer的父级是什么,请使用
allContainer.parent && allContainer.parent.removeChild(allContainer.parent);
(这个左侧只是作为一个守卫,确保只有当allContainer在舞台上时才会调用右侧,你可以选择将其写为:)
if (allContainer.parent)
{
allContainer.parent.removeChild(allContainer.parent);
}
你写的for循环也有问题,因为在你删除第一个孩子0后,所有孩子都向下移动一个索引,所以1的孩子现在为0但你的索引已经移到1,所以你一直想念孩子!而是使用它:
while (allContainer.numChildren)
{
allContainer.removeChildAt(0);
}
这样while循环将一直循环,直到allContainer的所有子节点都被删除。
或者,如果您希望以最佳方式快速运行,请使用
var i:int = allContainer.numChildren;
while (i--)
{
allContainer.removeChildAt(0);
}
希望这有帮助。