2016-09-12 11 views
0

の配列を作成しました。はplayersShotsのすべてであり、エイリアンはすべて画面の上部にスポーンするエイリアンです。libGDX配列から特定の値を取り除く方法

各エイリアンと弾丸の周りに衝突円があります。それらは配列になっているので、衝突が発生したかどうかを検索すると、それは本当だと言うでしょうが、私は具体的に衝突した2つのオブジェクトを削除するよう指定することはできないようです。私は半日過ごして、何かを運のないものにしようとしました。

私は、各エイリアンにレベル1などの値を与えようとしました.10人のエイリアンがいます。したがって、0から9までの値が生成されます。 それから私は殺したものの価値をつかんで、それを配列から取り除くでしょう(例えば、数字7を殺し、7番目のインデックスを削除します)。しかし、別の方法では、エイリアスのすべての値を(インデックスが終了した後に)1つ下に引き下げるために使用していました。これはインデックスサイズでエイリアンの値を修正するためですが、エイリアンを殺した後に実際に値を差し引くことはないので、代わりにプログラムが最終的に配列のインデックスを削除しようとするのでエラーが発生します存在する。なぜ私は確信しています。ここに私のコードです:私はそれ以来、問題を解決するためにそのひどい試みを削除しました。

private void didCollisionOccur() 
    { 
     for(Alien alien : aliens) 
     { 
      for(PlayerShot playerShot : playerShots) 
      { 
       if(Intersector.overlaps(alien.getCircle(), playerShot.getCircle())) 
       { 
        alien = aliens.removeIndex(0); 
        playerShot = playerShots.removeIndex(0); 
       } 
      } 
     } 
    } 

私は、これは本当に私が午前問題を表示するために必要だとすべてだと思います。あなたは私が今のところremoveIndex(0)を使用するように強制されていると言うことができます。それは、私が殺す異星人に関係なく、それを助けるものではありません。ただそれを(0)で取り除くだけです。

私はこれが私の解決策であることを望んでいた方法を再現します。

private void didCollisionOccur() 
{ 
    for(Alien alien : aliens) 
    { 
     for(PlayerShot playerShot : playerShots) 
     { 
      if(Intersector.overlaps(alien.getCircle(), playerShot.getCircle())) 
      { 
       getCountHolder = alien.getCount(); 
       alien = aliens.removeIndex(alien.getCount()); 
       playerShot = playerShots.removeIndex(0); 
      } 
     } 
    } 
    for(Alien alien : aliens) 
    { 
     if(alien.getCount() >= getCountHolder) 
     { 
      alien.takeFromCount(1); 
     } 
    } 
} 

次はAlien.class

public void takeFromCount(int value) 
    { 
     count -= value; 
    } 

    public int getCount() 
    { 
     return count; 
    } 

EDIT>

private Array<PlayerShot> playerShots = new Array<PlayerShot>(); 
private Array<Alien> aliens = new Array<Alien>(); 

Array Javadoc here

+0

'removeIndex(0);'私は、このメソッドがコレクション型にアタッチされていることに慣れていません。どのArrayを使用しましたか? –

+0

私が読んでいるのは、libGDXを教える本の1つです。 –

+0

申し訳ありませんが、私は改行するつもりだった...それはlibGDXでパッケージ化されています。それが役に立ったら、投稿にアレイをどのようにして追加したのかを追加します。 –

答えて

0

であるあなたが)(メソッドたremoveValueを試みたことがありますか?

https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/utils/Array.html#removeValue-T-boolean-

私はそれであなたはあなたの問題を解決することができますね。

private void didCollisionOccur() 
{ 
    for(Alien alien : aliens) 
    { 
     for(PlayerShot playerShot : playerShots) 
     { 
      if(Intersector.overlaps(alien.getCircle(), playerShot.getCircle())) 
      { 
       aliens.removeValue(alien,true); 
       playerShots.removeValue(playerShot,true); 
      } 
     } 
    } 
} 

これで、Javaが現在の変更例外を引き起こす可能性があります。このような場合は、両方のオブジェクトをループ外で参照してから削除する必要があります。

private void didCollisionOccur() 
{ 
    Alien tmpAlien = null; 
    PlayerShot tmpPlayerShot = null; 
    for(Alien alien : aliens) 
    { 
     for(PlayerShot playerShot : playerShots) 
     { 
      if(Intersector.overlaps(alien.getCircle(), playerShot.getCircle())) 
      { 
       tmpAlien = alien; 
       tmpPlayerShot = playerShot; 
      } 
     } 
    } 
    if(tmpAlien != null && tmpPlayerShot != null) 
    { 
     aliens.removeValue(tmpAlien,true); 
     playerShots.removeValue(tmpPlayerShot,true); 
    } 
} 
+0

ありがとう!それは大きな助けとなりました。 2つの行を変更するだけで、欲求不満の時間が分類されます。 XD少なくとも今、私は将来の参照のために何をすべきかを知っています。ありがとうございました。あなたの最初の提案でもすべてがうまくいきました。 :) 問題はありません。 –

関連する問題