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
Обратите внимание на потерю ссылки на этап после удаления объекта из списка отображения.
В вашем примере вы перебираете все дочерние элементы сцены и удаляете каждого из них. Это определенно приведет к потере ссылки на сцену из-за той же концепции, как показано выше.