マウスを使用してウィンドウをドラッグできる単純な 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 クラスを拡張して抽象メソッドを実装する、Circle、Square、Rectangle などの 10 個の具象クラスを用意します。私がやりたいことは、衝突検出を行うためのクリーンでエレガントな方法を考え出すことです。
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
}
誰にでもアイデアがあります。これは私が以前から考えていた問題ですが、今は実践に移したばかりです。