我的Actionscript 3.0阶段不会清除

时间:2011-10-11 23:59:08

标签: flash actionscript clear stage

我正在使用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;这些技术都没有奏效。我仍然不知道为什么以前的水平不会被卸载。

任何帮助将不胜感激!

谢谢!

1 个答案:

答案 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);
}

希望这有帮助。