0

我有一个 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 是来自主类的阶段的引用。

4

1 回答 1

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;

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

于 2013-03-10T03:27:39.337 回答