使用多态性以优雅的方式进行碰撞检测

Joh*_*arZ 6 .net c# polymorphism collision-detection

我正在尝试设置一些简单的2D形状,可以使用鼠标在窗口周围拖动.我想让形状在我将其拖入另一个时记录碰撞.我有一个界面.

interface ICollidable
{
    bool CollidedWith(Shape other);
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个抽象类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);
}
Run Code Online (Sandbox Code Playgroud)

然后我有十个具体的类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
}
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法.这是我以前想过的一个问题,但现在才开始实践.

hom*_*ast 1

它们不是特定的形状,而是路径区域

正方形只是一个有 4 个点的多边形,这些点恰好是直角。然后只需编写一种Path.CollidesWith(Path)方法即可开始使用。

查看一些相关 问题