使用活动事件侦听器从舞台中删除子项

时间:2014-12-21 22:25:06

标签: actionscript-3

我有一个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();

1 个答案:

答案 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仍会触发,我感到有些惊讶。