我想设置一些简单的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);
}
我有十个具体类Circle、Square、Rectangle等,它们扩展了Shape类并实现了抽象方法。 我希望能想出一种面向对象的干净而优雅的方式来进行碰撞检测,而不是在CollidedWith方法中使用大量的if语句块。
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
}
有人有什么想法吗?这是一个问题,我之前曾经思考过,但现在才开始付诸实践。
Shape
类是否还包含实例坐标的任何信息? - mclark1129