我有一个enemy
对象可以触发missile
个对象,就像这样;
public function fire():void {
var missile:Bullet = new Bullet();
stage.addChild(missile);
}
没问题。
现在,当任何导弹物体离开舞台区域时,我想将它们移除。看起来很简单。所以在我的Bullet
课程中,我做了以下工作;
我在构造函数中使用了调用this的标准方法;
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();
函数最终将包含在离开舞台时删除对象的代码,而不仅仅是在调用函数时。我可以trace
stageWidth
属性,没问题。那么为什么stage.removeChild(this);
会抛出这个错误呢?
[Fault] exception,information = TypeError:错误#1009:无法访问a null对象引用的属性或方法。
现在,这是令人困惑的地方。
如果我将stage.removeChild(this);
移至init();
,则效果非常好。那么为什么它会在那里工作,而不是在<{em> actions();
之后总是被称为的init();
?
答案 0 :(得分:0)
我从没想过要检查这个,因为我假设一旦一个对象从舞台上移除,它的所有事件监听器也会如此。
但是,从舞台中删除子项并不意味着该对象已被删除,因此stage.removeChild(this);
在actions();
内工作,但即使我在&#39; d从舞台中删除了bullet
对象,它仍在调用actions();
,然后再次调用stage.removeChild(this);
,当该对象在舞台上不再存在时,它试图引用该对象。
if (this.y > stage.stageHeight) {
stage.removeChild(this);
removeEventListener(Event.ENTER_FRAME, actions);
}
我所要做的就是删除事件监听器,以便在我从舞台上删除actions();
对象后停止调用bullet
。
希望其他人可以从我的错误中吸取教训。尽管如此,即使您将孩子从舞台上移走,Event.ENTER_FRAME
仍会触发,我感到有些惊讶。