我正在尝试设置一些简单的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类并实现了抽象方法.
我想做的是想出一些oop干净而优雅的方法来进行爆炸检测,而不是在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
- }
有没有人有任何想法.这是我以前想过的一个问题,但现在才开始实践.