マウスを使用してウィンドウについてドラッグできる単純な2Dシェイプを設定しようとしています。私は形を別のものにドラッグすると、衝突を登録するようにしたい。私はインターフェイスを持っています。多面体を使用したエレガントな衝突検出
interface ICollidable
{
bool CollidedWith(Shape other);
}
私は上記のインターフェイスを実装する抽象クラスShapeを持っています。
abstract class Shape : ICollidable
{
protected bool IsPicked { private set; get; }
protected Form1 Form { private set; get; }
protected int X { set; get; } // Usually top left X, Y corner point
protected int Y { set; get; } // Used for drawing using the Graphics object
protected int CenterX { set; get; } // The center X point of the shape
protected int CenterY { set; get; } // The center X point of the shape
public Shape(Form1 f, int x, int y)
{
Form = f;
X = x; Y = y;
Form.MouseDown += new MouseEventHandler(form_MouseDown);
Form.MouseMove += new MouseEventHandler(Form_MouseMove);
Form.MouseUp += new MouseEventHandler(Form_MouseUp);
}
void Form_MouseMove(object sender, MouseEventArgs e)
{
if(IsPicked)
Update(e.Location);
}
void Form_MouseUp(object sender, MouseEventArgs e)
{
IsPicked = false;
}
void form_MouseDown(object sender, MouseEventArgs e)
{
if (MouseInside(e.Location))
IsPicked = true;
}
protected abstract bool MouseInside(Point point);
protected abstract void Update(Point point);
public abstract void Draw(Graphics g);
public abstract bool CollidedWith(Shape other);
}
次に、Shapeクラスを拡張して抽象メソッドを実装する10個の具象クラスCircle、Square、Rectangleなどがあります。私がやりたい何 ではなく、そのようなCollidedWith方法で文が
public bool CollidedWith(Shape other)
{
if(other is Square)
{
// Code to detect shape against a square
}
else if(other is Triangle)
{
// Code to detect shape against a triangle
}
else if(other is Circle)
{
// Code to detect shape against a circle
}
... // Lots more if statements
}
が任意のアイデア誰を持っている場合の大きなブロックを持つcollosion検出を行うには、いくつかのOOPクリーンかつエレガントな方法を考え出すされています。これは私が以前考えていた問題ですが、今は実践しています。
どのようにして衝突を定義するのか、そしてサブクラス間でどのように変化するのか説明できると便利です。 'Shape'にはインスタンス座標に関する情報も含まれていますか? – mclark1129
@Mick C.シェイプクラスのコード全体を挿入するコードを変更しました –