【发布时间】:2012-09-06 17:03:24
【问题描述】:
我正在尝试设置一些简单的 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是否还会包含有关实例坐标的任何信息? -
@Mick C. 我已经更改了插入 Shape 类的整个代码的代码
标签: c# .net polymorphism collision-detection