as3父母如何才能成为空?

时间:2014-06-29 11:11:37

标签: actionscript-3 parent-child

我正在创建一个塔防游戏,并在aoe塔上同时摧毁2个怪物我得到' TypeError:错误#1009:无法访问空对象引用的属性或方法...在Document / loop()...在EnemyRed / removeSelf()'

我在文档类中使用Event.ENTER_FRAME函数检查是否(monster hp< 0),然后调用monster类中的一个函数将其自身从其父类中删除。 (以下代码)。

跟踪显示它正在尝试删除相同的实例两次,即使它本应已从数组中删除。

文档类:

public function loop(event:Event):void
    {

        //If enemy hit points < 0 remove self
        if(enemies.length > 0)
        {
            for(var e = 0; e < enemies.length; e++)
                {
                    if(enemies[e].hitPoints <= 0)
                    {
                        enemies[e].removeSelf();

怪物类:

public function removeSelf():void
    {
            trace(this.name);
            trace(this.parent);
            removeEventListener(Event.ENTER_FRAME, loop);
            parent.removeChild(this);
            Document.enemies.splice(this,1);
    }

追踪返回:

Monster:  instance2019
Parent:  [object Level1]
Monster:  instance2019
Parent:  null

1 个答案:

答案 0 :(得分:0)

已经有一段时间了,但我认为应该是

public function removeSelf():void {
  trace(this.name, this.parent);

  if (hasEventListener(Event.ENTER_FRAME)) {
    removeEventListener(Event.ENTER_FRAME, loop);
  }
  if (parent) {
    parent.removeChild(this);
  }
  var index:int = Document.enemies.indexOf(this);
  if (index > -1) {
    Document.enemies.splice(index,1);
  }
}

现在应该正确删除实例。

此外,向后迭代enemies数组会更好,因为当您在向前迭代时将一个元素拼接出一个数组时,下一个项会转移到先前的位置,并且第一个位置没有经过迭代。如果在向后迭代时拼接元素,则更改位置的元素已在此循环中处理,因此不会发生错误。在这种情况下,该bug只会导致0-HP怪物在被移出阵列之前持续存在几帧,但其他情况甚至可能延伸到破坏你的游戏。

for(var e:int = enemies.length-1; e >=0; e--)
            {
                if(enemies[e].hitPoints <= 0)
                {
                    enemies[e].removeSelf();