2016-05-08 9 views
0

私のゲームでは、異なるネットサイズの隕石が降っています。私は、大きな隕石に触れると、それが(アレイから)削除され、小さな隕石オブジェクトが、大きなものが取り除かれたのと同じ場所に置かれるように、作ろうとしました。画面に触れたときのオブジェクトの産出に関する問題[LibGDX]

私が持っている問題は、大きな隕石に触れると、それが取り除かれ、最小のものになり完全に消えてしまうまで、他のすべての隕石の種類を通過するということです。私は明らかにそれを望んでいません。この問題の解決方法も不明です。ここで

は、入力を処理するコードです:

private void handleInput() { 
    Iterator<FallingItem> iter = items.meteorites.iterator(); 
    while (iter.hasNext()) { 

     FallingItem item = iter.next(); 

     if (Gdx.input.justTouched()) { 

      gameCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0)); 

      if (item.getClass() == SmallMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) { 

       meteoriteDestroyed.play(0.5f); //play sound 
       iter.remove(); //removes item from array when it's no longer needed 
       item.dispose(); //dispose meteorite texture to clear up memory 
       score += 20; //add to score 

      } else if (item.getClass() == MediumMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) { 

       meteoriteDestroyed.play(0.5f); 
       iter.remove(); 
       item.dispose(); 
       score += 10; 

       items.meteorites.add(new SmallMeteorite(item.getBounds().getX(), item.getBounds().getY())); 

      } else if (item.getClass() == LargeMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) { 

       meteoriteDestroyed.play(0.5f); 
       iter.remove(); 
       item.dispose(); 
       score += 10; 

       items.meteorites.add(new MediumMeteorite(item.getBounds().getX(), item.getBounds().getY())); 

      } 
     } 
    } 
} 

答えて

0

彼らはまだ上の反復を受けるようにするには、配列に項目を追加しています。代わりに、繰り返しの後で変更できるように、何らかの形でマークする必要があります。これを行うにはいくつかの方法があります。

1つの方法は、別のリストを保持することです。このループを実行する前にクリアし、小さいもので置き換える必要がある項目を別のリストに追加します。メインリストでループが終了すると、別のリストを反復して、メインリストに小さなバージョンを追加することができます。

しかし、LibGDXはさらに簡単な方法です。あなたの隕石を保存するためにリストを使用する代わりに、LibGDXのSnapshotArrayクラスを使用してください。それはあなたのリストのコピーに反復することができますので、あなたが反復して行われているまで、配列への変更は有効になりません。

FallingItem[] array = snapshotArray.begin(); 
for (int i=0; i<snapshotArray.size; i++){ //important to use snapshotArray.size, not array.length 
    FallingItem item = array[i]; 
    //... 
     //if (something) {snapshotArray.removeIndex(i, true); snapshotArray.add(new Something());} 
} 
array.end(); 

しかし、あなたもそれを試す前に、あなたが実際に必要かどうかを考えますSmallMeteorite、MediumMeteoriteなどのためのクラスを別にしています。オーバーカプセル化のようなものは間違いありません。これらのオブジェクトがすべて同じ振る舞いをしていて、単に異なるパラメータを持つ場合は、パラメータが異なるサイズを表すようにパラメータが変更された単一のクラスである必要があります。次に、配列内の配列を削除して置換する代わりに、それらのパラメータを変更するだけで済みます。

サイドノート:justTouchedをチェックし、ループの内側ではなくunprojectをループ内で実行するのは無駄です。そこに冗長な繰り返しがたくさんあります。

+0

申し訳ありませんが、答えに感謝します。あなたは私が調べるいくつかの良い点を作った。 –

関連する問題