私は単純な物理ベースのゲームをJavaで作成していますが、衝突検出メソッドの実装にはまっています。私は、いくつかのクラスを持っています。私はすべての可視オブジェクトを形状クラスのarraylistに格納しています。私はオブジェクトの可能なすべての衝突のためのいくつかの衝突検出メソッドを作成しました。私はこのようなコードになってしまったのメソッドの実装を始めたとき :oopで衝突検出器を実装する最善の方法
private void collision_detector(Shape s1,Shape s2){
if(s1.getClass()==Ball.class)
if(s2.getClass() == Block.class) collision_detector((Ball)s1,(Block)s2);
else collision_detector((Ball)s1,(Ball)s2);
else if(s1.getClass()==Block.class)
if(s2.getClass()==Block.class) collision_detector((Block)s1,(Block)s2);
else collision_detector((Ball)s2,(Block)s1);
}
を私はすべての可能性をチェックするために、このメソッドを更新する必要があるためそれだけでは衝突検出を実装するための正しい方法のように感じることはありません。私は三角形や六角形のような新しい形を追加するたびに組み合わせます。 私は訪問者のパターンについて少し知っています。しかし、これを行うためのより良い方法はありますか?また、あなたのために衝突アルゴリズムを実装するために自由を与える
public abstract class Shape {
public abstract boolean collidesWith (Shape s);
}
public class Ball extends Shape {
@Override public boolean collidesWith (Shape s) {
if (s instanceof Block)
return Collision.blockBall((Block)s, this);
else if (s instanceof Ball)
return Collision.ballBall(this, (Ball)s);
else
return false;
}
}
public class Block extends Shape {
@Override public boolean collidesWith (Shape s) {
if (s instanceof Block)
return Collision.blockBlock(this, (Block)s);
else if (s instanceof Ball)
return Collision.blockBall(this, (Ball)s);
else
return false;
}
}
public class Collision {
public static boolean blockBlock (Block a, Block b) { ... }
public static boolean blockBall (Block a, Ball b) { ... }
public static boolean ballBall (Ball a, Ball b) { ... }
}
:あなたがオブジェクトで自分自身を衝突検出コードを入れてもかまわない場合
私はあなたの主要な質問に取り組んでいますが、1つは、getClass()の代わりに 'if(s1 instanceof Ball)'を使うことです。これはもう少し標準的でタイピング効率のよい方法です。 – snickers10m
これらはあなたのクラスですか? ( 'Shape'、' Ball'、 'Block') もしそうでなければ、あなたが使用しているAPIであれば、あらかじめ作成された衝突検出を見つけることができます。 – snickers10m
パフォーマンスの重要性は不明ですが、衝突アルゴリズムのリストを登録したり、シェイプクラスが与えられたマップを使用したりして、シェイプクラスが与えられたリストで適切なアルゴリズムを見つけることができます。下の私の答えに追加された新しい例を見てください。 –