私は今、単純なゲームを書いています。多くのオブジェクトの衝突を検出できる必要があります(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は、問題はコードではなく、瞬間的でなければならないと言っていた。
@trashgod、[Collision Detection](https://sites.google.com/site/drjohnbmatthews/kineticmodel)でこのリンクを見てください。これはElastic Collisionsを扱っていますが、あなたの努力の中でいくらか助けてくれるかもしれません:-) –
あなたの現在のアプローチは、少数のオブジェクトでは問題ありません。それはおそらく些細なことかもしれません。衝突検出をオンにするか、または何らかの衝突を検出すると、プログラムが遅くなりますか?いくつのタンクと弾丸がそこにありますか?衝突の有無にかかわらず、いくつのfpsがありますか? –