2016-03-30 11 views
1

私はLibGdxでスクロールゲームをしています。array.remove(0)複数の要素を削除しています

はrenderメソッドでは、私はその後、私は反復処理し、画面上に描画メソッドに渡し、私はdinamically enemiesにArrayListのを追加ArrayList<ArrayList<Enemy>> enemies;

からいくつかのデータを取得します。このメソッドは、画面上に表示されなくなった行全体の削除も処理します。

つまり、要するに、この配列からアイテムを追加して削除します。 残念ながら、削除手順ではそれ以上のものを削除しているようです。

有効なコードを次に置いて、あなたがうまくいかないようにします。

public class Enemy extends ... implements .. { 
    [getters and setters] 
} 

public class GameRenderer { 
    ... 
    // Enemies 
    ArrayList<ArrayList<Enemy>> enemies; 
    ... 

    private void drawEnemies(float delta) { 

     // Get Enemy Array 
     for (int i = 0; i < enemies.size(); i++) { 

      for (Enemy enemy : enemies.get(i)) { 
       drawEnemy(enemy, delta); 
      } 
     } 

    } 

    public void addEnemiesToArray(ArrayList<Enemy> enemiesRow) { 
     enemies.add(enemiesRow); 
    } 
} 

private boolean drawEnemy(Enemy enemy, float delta) { 
    // get info from enemy and draw 
    if (enemy.getY() <= 0) 
     enemies.remove(0); 
} 

そして、すべてがプロセッサクラスから呼び出される:

public void update(float delta) { 

    [methods...] 

    switch (mRace.getRaceState()) { 

     case RUNNING: 
      mRace.update(delta, 1); 
      if (enemyReference.canSpawnNewLine() && enemyReference.getY() < 350) { 
       enemyReference.setCanSpawnNewLine(false); 
       spawnNewLine(); 
      } 
      break; 

    } 

    mRenderer.render(mRace.getRaceState(), mRace.getOldRaceState(), delta); 
} 

public void spawnNewLine() { 
    ArrayList<Enemy> enemies = getEnemiesArray(numOfEnemies(), 0); 
    enemyReference = enemies.get(0); 
    mRenderer.addEnemiesToArray(enemies); 
} 

私の問題はenemies.remove(0)drawEnemyにおける方法は、最初の行以上を削除、それは2又は3を除去することです行を一度に表示します。これをどうすれば処理できますか?

+4

あなたは、各リスト要素(行)は、あなたがそれを作成&追加方法を、何であるかの種類を示すいくつかのソースコードを追加することができますそれをリストに追加し、0以外の特定のリスト要素も削除されていることをどのように知っているかを説明します。 –

+2

デバッガでプログラムをステップ実行しようとしましたか? 'remove(0)'はリストの最初の要素だけを削除し、他の要素は削除しません。 –

+0

http://stackoverflow.com/help/mcve –

答えて

1

大変お手伝いしてくれた@hoazに感謝します。

私は自分の問題を解決する方法を考え出しました。レンダリング方法の外で行を削除する処理をしています。私のプロセッサのクラスで

:更新方法で

// variable: 
private ArrayList<Enemy> enemiesRef; 

switch (mRace.getRaceState()) { 

     case RUNNING: 
      mRace.update(delta, 1); 
      if (enemyReference.canSpawnNewLine() && enemyReference.getY() < 350) { 
       enemyReference.setCanSpawnNewLine(false); 
       spawnNewLine(); 
      } 
      // This handle the removing 
      if (enemiesRef.get(0).getEnd() <= 0) { 
       mRenderer.removeFirst(); 
       enemiesRef.remove(0); 
      } 
      break; 

    } 
2

並行処理の問題が同時に発生し、同時に行を追加したり削除したりする可能性はありますか?実装を見ずに言うのは難しいです。

また、リストの途中で行われる削除操作の方が最適化されているため、LinkedListの使用を検討してください。

Collections#synchronizedListは、並行性の問題に役立つ場合があります。

関連する問題