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 に答える