2012-03-23 16 views
2

私は今、単純なゲームを書いています。多くのオブジェクトの衝突を検出できる必要があります(10個のオブジェクトが他の20個のオブジェクトと衝突するかどうかをチェックします。衝突検出 - 任意の言語

 //Check for collisions between tanks and bullets 
     ArrayList<Object> objectsToRemove = new ArrayList<Object>(); 
     for (int i = 0; i < tanksOnScreen.size(); i += 1) { 
      //Get tank 
      Tank tank = tanksOnScreen.get(i); 

      for (int e = 0; e < bulletsOnScreen.size(); e += 1) { 
       //Get bullet 
       Bullet bullet = bulletsOnScreen.get(e); 

       //Check for collision 
       if (tank.collides(bullet.x, bullet.y, 10, 10)) { 
        System.out.println("Collide"); 
        objectsToRemove.add(bullet); 
        objectsToRemove.add(tank); 
        break; 
       } 
      } 
     } 

     for (Object obj:objectsToRemove) { 
      if (obj.getClass().equals(Bullet.class)) { 
       bulletsOnScreen.remove(bulletsOnScreen.indexOf(obj)); 
      } else if (obj.getClass().equals(Tank.class)) { 
       tanksOnScreen.remove(tanksOnScreen.indexOf(obj)); 
      } 
     } 

そしてタンクのcollides()方法:

public boolean collides(float px, float py, float pwidth, float pheight) { 
    // If the distance between the two centers of the lines on x and y axis 
    // Is less than the distance of half the w and h added together, the objects 
    // Are colliding 
    float x1 = (px > x) ? x : px, x2 = (px > x) ? px : x, y1 = (py > y) ? y : py, y2 = (py > y) ? py : y; 
    float w1 = (x1 < x2) ? width : pwidth, w2 = (x1 < x2) ? pwidth : width, h1 = (y1 < y2) ? height : pheight, h2 = (y1 < y2) ? pheight : height; 
    if ((x2 + w2/2) - (x1 + w1/2) < (w1/2 + w2/2)&&(y2 + h2/2) - (y1 + h1/2) < (h1/2 + h2/2)) { 
     return true; 
    } else { 
     return false; 
    } 
} 
私が動作するようになりましたが、私は(ちなみに、Javaの)衝突を検出した後、ゲームが極端に遅くする原因となるいくつかの簡単なコードを書いています

オブジェクトを反復するために、ループがダブルforループであると仮定します。私はどのようにこれらのループを根絶するか、またはスクリーンの特定の領域で弾丸を取得する方法についてはわかりませんが、別のforループを使用せずにこれらの箇条書きをチェックするだけです(分離、私は思う)。誰もが多くのオブジェクトと衝突検出のための正しい方向に私を指すことができますか?たとえ擬似コードであっても、答えがどの言語であるかは気にしません。私は今、レンダリングやゲームを追加して、Java用のスリックグラフィックスAPIを使用してアップデートを提供していると方法をレンダリングしてい

おかげで、

ベン

編集1

論理。私はこの衝突検出をupdateメソッドに置きました(毎フレーム約60回、毎フレームと呼ばれています)。この遅さは、衝突が発生した後に発生し、オブジェクトは画面から削除されます - 私は奇妙に感じます。おそらくbreakコマンドは、forループ内のオブジェクトを削除した後にそれを根絶するでしょうか?

編集2

すべての答えのみんなのおかげで、との言及は、将来のための大きな助けです。私はループのために弾丸とタンクを交換することによってのみ問題を解決したので、弾丸が破壊された後もループを継続しませんでした。私は最終的に解決するのがとても簡単だったので、質問してはいけません。 DaveとBantharは、問題はコードではなく、瞬間的でなければならないと言っていた。

+0

@trashgod、[Collision Detection](https://sites.google.com/site/drjohnbmatthews/kineticmodel)でこのリンクを見てください。これはElastic Collisionsを扱っていますが、あなたの努力の中でいくらか助けてくれるかもしれません:-) –

+0

あなたの現在のアプローチは、少数のオブジェクトでは問題ありません。それはおそらく些細なことかもしれません。衝突検出をオンにするか、または何らかの衝突を検出すると、プログラムが遅くなりますか?いくつのタンクと弾丸がそこにありますか?衝突の有無にかかわらず、いくつのfpsがありますか? –

答えて

0

すべての回答者のおかげで、参考文献は今後の大きな助けになります。私はループのために弾丸とタンクを交換することによってのみ問題を解決したので、弾丸が破壊された後もループを継続しませんでした。私は最終的に解決するのがとても簡単だったので、質問してはいけません。 DaveとBantharは、問題はコードではなく、瞬間的でなければならないと言っていた。

3

octreeを使用することをお勧めします。弾丸が動くにつれ、私はあなたがそれの動力学的なバージョンを必要とすると仮定します - インターネット上の動力学的データ構造に関する記事の束があります。

もっと複雑な凸多角形の衝突を検出したい場合は、この計算には非常に高速なgjkアルゴリズムを使用することをお勧めします。これにより、ペアのオブジェクトの衝突検出時間が短縮されるだけで、ペア数は変わりません。

2

私は何かが欠けている、またはnはそれがユーザーに瞬時に見えるはずです20です、あなたはOで実行している、示す(N^2)していない追加のコードは、ありますない限り。

デバッガでステップ実行して、どこが減速しているかを確認します。

詳細を編集する:高価な操作は、あなたが投稿したコードにありません。それはあなたが投稿したコードによって呼び出される別の場所です。