AS3 после удаления всех дочерних элементов из stage, stage становится нулевым объектом?

Я использовал этот код в своем классе документов AS3, чтобы удалить все объекты со сцены:

var _stage:DisplayObjectContainer = stage as DisplayObjectContainer;
while (_stage.numChildren > 0) {
    _stage.removeChildAt(0);
}

и это, кажется, работает очень хорошо с одним исключением. После этого можно нажать кнопку, чтобы загрузить все на сцену. В этой функции построения некоторые условия добавляются для создания прослушивателей событий для сцены, если они еще не существуют:

if(!stage.hasEventListener(KeyboardEvent.KEY_DOWN));
    stage.addEventListener(KeyboardEvent.KEY_DOWN, handle_key);
if(!stage.hasEventListener(MouseEvent.MOUSE_MOVE));
    stage.addEventListener(MouseEvent.MOUSE_MOVE, manage_cursor);   

РЕДАКТИРОВАТЬ: сцена определенно нулевая, я положил if(stage){} вокруг этого раздела кода, и ошибка возникла в следующей точке кода, на которой используется этап

Я получаю ошибку, однако, при реконструкции, TypeError: Error #1009: Cannot access a property or method of a null object reference. со ссылкой на "этап".

Дальнейшие исследования показывают, что, возможно, удаление всех объектов DisplayObject со сцены лишает возможности доступа к самой сцене до тех пор, пока в нее не будет добавлен объект DisplayObject. Однако для меня это не имеет никакого смысла, и я не совсем уверен, как продолжить.

Любая помощь будет принята с благодарностью.

1 ответ

Решение

Если вы вызываете "stage" из MovieClip, ссылка будет ТОЛЬКО ненулевой, когда MovieClip находится в списке отображения. Этап всегда существует после загрузки Flash, но отдельные экземпляры MovieClip могут получить / потерять ссылку на него, когда они добавлены / удалены из списка отображения.

Это относится даже к корневому экземпляру вашего документа. Как только какой-либо DisplayObject удаляется из списка отображения, для его ссылки на этап устанавливается значение NULL.

Вот пример использования корневого документа, который иллюстрирует концепцию:

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    [SWF(width="800", height="600", frameRate="60"]
    public class Main extends Sprite
    {
        public function Main()
        {
            addEventListener(Event.ENTER_FRAME, onEnterFrame, false, 0, true);
        }

        private function onEnterFrame(event:Event):void
        {
            if (stage != null)
            {
                trace("stage: "+stage);
                stage.removeChild(this);
                trace("stage: "+stage);

               removeEventListener(Event.ENTER_FRAME, onEnterFrame);
            }
        }
    }
}

Этот код выведет:

stage: [object Stage]
stage: null

Обратите внимание на потерю ссылки на этап после удаления объекта из списка отображения.

В вашем примере вы перебираете все дочерние элементы сцены и удаляете каждого из них. Это определенно приведет к потере ссылки на сцену из-за той же концепции, как показано выше.

Другие вопросы по тегам