2014-12-21 2 views
0

У меня есть объект enemy, который вызывает missile объектов, например;Удаление ребенка со сцены с помощью активных прослушивателей событий

public function fire():void { 
      var missile:Bullet = new Bullet(); 
      stage.addChild(missile); 
     } 

Проблем нет.

Теперь, когда любые объекты ракеты покидают сцену, я хочу их удалить. Кажется достаточно простым. Поэтому в моем классе Bullet я сделал следующее:

Я использовал стандартный метод вызова этого в моем конструкторе;

if (stage) init(); 
else addEventListener(Event.ADDED_TO_STAGE, init); 

Который затем запускает init();

public function init(e:Event = null):void { 
      trace("init");    
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      addEventListener(Event.ENTER_FRAME, actions); 
     } 

actions(); Так запускается Event.ENTER_FRAME;

public function actions(e:Event):void { 
       this.move(); 
       trace(stage.stageWidth); // this works fine 
       stage.removeChild(this); // this throws Error #1009: 
      } 

Я просто использую это пример. Моя функция actions(); в конечном итоге содержит код для удаления объекта, когда он покидает сцену, а не только при вызове функции. Я могу tracestageWidth недвижимость, без проблем. Так почему же stage.removeChild(this); выбрасывает эту ошибку?

[Fault] exception, information=TypeError: Error #1009: Cannot access a property or method of a null object reference.

Теперь, это место, где оно становится действительно озадачивающим.

Если я переведу stage.removeChild(this); в init();, он отлично работает. Так почему он там работает, а не в actions();, который всегда называется послеinit();?

ответ

0

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

Удаление ребенка от стадии, однако, не означает, что объект был удален, так stage.removeChild(this);был работает в actions();, но несмотря на то, что я удалил bullet объект со сцены, он все еще зову actions(); , который затем снова вызывал stage.removeChild(this);, который пытался ссылаться на объект, когда он больше не существовал на сцене.

if (this.y > stage.stageHeight) { 
       stage.removeChild(this); 
       removeEventListener(Event.ENTER_FRAME, actions); 
      } 

Все, что я должен был сделать удалить слушателя события для actions(); бы перестать быть под названием после того как я удалил bullet объект со сцены.

Надеюсь, кто-то может узнать из моей ошибки, здесь. Тем не менее, я немного удивлен тем, что Event.ENTER_FRAME все еще срабатывает, даже когда вы удаляете ребенка со сцены.

Смежные вопросы