Мой ActionScript 3.0 Stage не будет очищен - PullRequest
1 голос
/ 12 октября 2011

Я работаю над побочной прокруткой во Flash Actionscript 3.0. Прямо сейчас я пытаюсь позволить игроку перейти на следующий уровень, касаясь определенного объекта. Перед загрузкой следующего уровня я пытаюсь удалить все объекты предыдущего уровня (фон и «пол»), которые являются MovieClips, со сцены. Когда загружается следующий уровень, я все еще вижу активы предыдущего уровня, хотя Игрок не может взаимодействовать с ними.

Я просмотрел Интернет и попробовал несколько способов решить мою проблему, но я ни к чему не привел. Ниже приведен код, который я использую для перехода с одного уровня на другой. «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  

Как видно, я испробовал как минимум два метода, чтобы разгрузить активы предыдущего уровня. Я попытался пройти этап и удалить все элементы один за другим, используя цикл for. И я попытался удалить элемент сцены с индексом 0, пока на сцене есть объект. Я также пытался ссылаться на «root» вместо «stage» при добавлении объектов с помощью «addChildAt ()». Ни один из этих методов не работал. Я до сих пор не знаю, почему предыдущий уровень не будет выгружен.

Любая помощь будет оценена!

Спасибо!

1 Ответ

1 голос
/ 14 октября 2011

Если вы не уверены, кто является родителем 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);
}

Надеюсь, это поможет.

...