Стадия становится нулевой

Я создаю игру с AS3 в Flash Professional CS5.5.

В этой игре у меня есть кнопка "снова", чтобы игрок мог сбросить уровень и начать заново. Моя проблема сейчас:

После нажатия «еще раз» этап становится нулевым.

Все, что я делаю в методе «ResetLevel», это то, что я устанавливаю позиции x и y некоторых элементов обратно в 0, удаляю некоторые элементы из мувиклипа, но не удаляю ВСЕ элементы из списка отображения. Таким образом, фон, худ, самолет не удаляются из мувиклипа. Вот набросок моего списка отображения. Удаляемых предметов иногда нет, иногда их 30 и более предметов (зависит от времени игры и т. д.)

Displaylist:

stage
|-- Game movieclip
    |--LevelBackground
    |--Removeable item 
    |--Removeable item
    |--Removeable item
    |--Plane
    |--HUD

Но после удаления «съемных элементов» и установки координат положения levelbackground и плоскости сцена становится нулевой.

Может быть, кто-то может помочь мне указать мне на решение этой проблемы.

ИЗМЕНИТЬ:

Внутри "игрового мувиклипа" будет вызываться метод "ResetLevel", и доступ к сцене также будет осуществляться из "игрового мувиклипа". Поэтому я не удаляю «игровой ролик» из списка отображения при сбросе уровня. Я удаляю только некоторые элементы, которые содержит игровой мувиклип из мувиклипа.

Вот некоторый псевдокод из "класса игрового ролика" (GameMC):

public class GameMC extends Sprite {

    //Some properties here

    public function GameMC() {
        //Some code here

        //--Events--
        this.addEventListener(Event.ADDED_TO_STAGE, Init, false, 0, true);
        this.addEventListener(Event.REMOVED_FROM_STAGE, Removed, false, 0, true);
    }

    private function Init(e:Event) {
        this.removeEventListener(Event.ADDED_TO_STAGE, Init);
        //Some Code here
    }

    private function ResetLevel() {
        //Some Code here, too
        if(removeItemArray.length > 0) {
            for(i = 0; i < removeItemArray.length; i++) {
                currentRemoveableItem = removeItemArray[i];
                this.removeChild(currentRemoveableItem );
                removeItemArray.splice(i, 1);
            }
        }
        level.x = 0;
        level.y = 0;

        trace(stage); //Will output null
    }
}

person WolvDev    schedule 19.07.2012    source источник
comment
Из документов. ›If a display object is not added to the display list, its stage property is set to null.   -  person Engineer    schedule 19.07.2012
comment
Я знаю, но я не удаляю мувиклип Game из списка отображения, а внутри этого мувиклипа пытаюсь получить доступ к stage.stageWidth. Внутри видеоклипа «Игра» я работаю с ADDED_TO_STAGE и REMOVED_FROM_STAGE.   -  person WolvDev    schedule 19.07.2012
comment
GameMC случайно не подключен к библиотечному элементу, который вы разместили на сцене? Если это так, то он будет автоматически удален со сцены, если ваша временная шкала перейдет к кадру, в котором его нет.   -  person weltraumpirat    schedule 19.07.2012
comment
Нет, это не так. И я допустил ошибку в своем коде выше, это не расширенный MovieClip, это расширенный Sprite.   -  person WolvDev    schedule 19.07.2012


Ответы (2)


Когда DisplayObject удаляется из DisplayList, он больше не содержит никаких ссылок на сцену. Итак, все, что вам нужно установить/вычислить, делайте это в допустимом состоянии. Event.ADDED, Event.ADDED_TO_STAGE, Event.REMOVED и Event.REMOVED_FROM_STAGE помогают проверить правильность состояния DisplayObject.

person Florian Salihovic    schedule 19.07.2012
comment
То, что вы написали, верно. Но это не ответ на Maybe someone can help me to point me to a solution for this problem? вопрос. - person Engineer; 19.07.2012
comment
Внутри мувиклипа игры я работаю с ADDED_TO_STAGE и REMOVED_FROM_STAGE, и я не удаляю мувиклип игры со своей сцены/списка отображения/где бы то ни было, и внутри этого мувиклипа я пытаюсь получить доступ к сцене. - person WolvDev; 19.07.2012
comment
Да, проще всего было бы установить флаг, находится ли DisplayObject на сцене или нет. - person Florian Salihovic; 19.07.2012
comment
Отредактировал мой вопрос с некоторым псевдокодом для лучшего понимания. - person WolvDev; 19.07.2012
comment
Вам не нужен флаг - просто проверьте, является ли ссылка stage null - если это так, объект отсутствует в списке отображения. - person weltraumpirat; 19.07.2012

Теперь я хранил сцену в свойстве и получал к ней доступ:

public class GameMC extends Sprite { 

    //Some properties here
    private var stagevar:Stage;

    public function GameMC() { 
        //Some code here 

        //--Events-- 
        this.addEventListener(Event.ADDED_TO_STAGE, Init, false, 0, true); 
        this.addEventListener(Event.REMOVED_FROM_STAGE, Removed, false, 0, true); 
    } 

    private function Init(e:Event) { 
        this.removeEventListener(Event.ADDED_TO_STAGE, Init); 
        this.stagevar = stage;
        //Some Code here 
    } 

    private function ResetLevel() { 
        //Some Code here, too 
        if(removeItemArray.length > 0) { 
            for(i = 0; i < removeItemArray.length; i++) { 
                currentRemoveableItem = removeItemArray[i]; 
                this.removeChild(currentRemoveableItem ); 
                removeItemArray.splice(i, 1); 
            } 
        } 
        level.x = 0; 
        level.y = 0; 

        trace(stagevar); //Will output [Object Stage]
    } 
} 
person WolvDev    schedule 19.07.2012