AS3 после удаления всех дочерних элементов из stage, становится нулевым объектом? - PullRequest
1 голос
/ 09 января 2012

Я использовал этот код в своем классе документов 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){}часть кода, и ошибка возникла в следующей точке кода, где используется stage

Однако при восстановлении я получаю сообщение об ошибке TypeError: Error #1009: Cannot access a property or method of a null object reference. со ссылкой на «stage».

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

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

1 Ответ

2 голосов
/ 10 января 2012

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

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

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

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

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

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

...