6

マウスを使用してウィンドウをドラッグできる単純な 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
}

誰にでもアイデアがあります。これは私が以前から考えていた問題ですが、今は実践に移したばかりです。

4

3 に答える 3

4

衝突検出は「形状固有」であるため、の順列ごとに異なる実装があります

Circle vs. Other Circle
Circle vs. Other Square
Circle vs. Other Triangle
Square vs. Other Circle
...

すべての可能性のマトリックスを作成しようとしているように聞こえますが、10個の新しい形状、合計20個を思いついた場合、400個の可能性があります。

代わりに、私はShape.Overlaps(Shape other)あなたの抽象クラスでそれらすべてを満たすジェネリックメソッドを考え出そうとします。

これが単なる2Dジオメトリである場合、任意の形状のエッジパスが交差するかどうかを把握するのは簡単です。

于 2012-09-06T17:09:37.137 に答える
1

特定の形状の代わりに、それらはすべてパスまたはリージョンです。

正方形は、たまたま直角になっている4点のポリです。次に、1つのPath.CollidesWith(Path)メソッドを記述して、作業を進めます。

いくつかの関連する 質問をチェックしてください。

于 2012-09-06T17:06:43.713 に答える
1

この状況では、通常、二重ディスパッチが使用されます。

于 2012-09-06T17:15:52.990 に答える