离开舞台AS3时从数组中删除对象

时间:2013-03-10 03:17:31

标签: actionscript-3 flash

我有一个for循环,可以检测敌人是否击中子弹或玩家。那些命中测试工作正常,但当敌人离开舞台时,我无法弄清楚如何从阵列中移除敌人。

这是for循环

for (var i:int = _enemies.length - 1; i >= 0; i--){
    for(var j:int = _bullets.length - 1; j >= 0; j--){
        if(_bullets[j] != null && _enemies[i] != null){
            //Check if bullet hits enemy
           if(_bullets[j].hitTestObject(_enemies[i])){
                //Tells enemy he's hit
                if (_enemies[i] != null && _bullets[j] != null){
                      _enemies[i].isHit(_bullets[j].getType());

                    if(_enemies[i].getHealth() <= 0){
                         _enemies.splice(i, 1);
                    }
                 }

                 //removes bullet
                if(_bullets[j] != null){
                    if (_bullets[j].parent) {
                        _bullets[j].parent.removeChild(_bullets[j]);
                        _bullets.splice(j, 1);
                    }
                }  
                if(_bullets[j] != null){
                   if(_bullets[j].x > _stage.stageHeight){
                        if (_bullets[j].parent) {
                             _bullets[j].parent.removeChild(_bullets[j]);
                             _bullets.splice(j, 1);
                        }
                   }
                   else{
                       _bullets.splice(j, 1);
                   }
                }
            }

            //Check if player hit
            else if(_enemies[i] != null && _player != null){
                if(_enemies[i].hitTestObject(_player)){
                    if (_enemies[i] != null){
                       _enemies[i].isHit("player");
                       _enemies.splice(i, 1);
                    }
                    else if (_enemies[i] == null){
                       _enemies.splice(i, 1);
                    }
                }
             }

             if (_enemies[i] != null){
                 if(_enemies[i].isDead == true){
                     _enemies.splice(i, 1);
                  }
              }
              else if(_enemies[i] != null){
                 if(_enemies[i].x < 0){
                     _enemies.splice(i, 1);
                 }
              }

              if(_stage.contains(_enemies[i])){
              }
              else{
                 _enemies.splice(i, 1);
              }
          }
      }
 }

_stage是主要阶段的舞台参考。

1 个答案:

答案 0 :(得分:0)

您正在移除子弹

_bullets[j].parent.removeChild(_bullets[j]);

类似地

_enemies[i].parent.removeChild(_enemies[i]);

当对象x或y属性超出阶段边界

时,有条件地使用它

例如,假设敌人的坐标从0,0开始

   // _enemies[i].x > stage.stageWidth
   // _enemies[i].y > stage.stageHeight
   // _enemies[i].x +_enemies[i].width  < 0
   // _enemies[i].y + _enemies[i].height < 0

虽然更好的方法是向敌人类添加一个方法,首先删除其显示列表中的每个子节点。之后,你可以将它从舞台上移除最后是数组的引用。

要删除数组引用,只需将数组元素设置为null,

_enemies[i] = null;

垃圾收集器将负责从内存中删除未引用的对象。