2D-Monogame: Rectangle collision detection, Seite bestimmte

Ich habe zwei Rechtecke, ein Spieler, eine Karte. Der Spieler muss nicht in der Lage sein, zu Fuß über die Karte. Sowohl der Spieler und der Karte ein Rechteck mit position und textur-Breite und Höhe, beide haben auch eine Vektor-position. Rectangle.Intersect() gibt nur einen booleschen Wert, ich kann nicht herausfinden, wie könnte ich herausfinden, auf welcher Seite war, kollidierte mit. Ich fand diese Funktion hier die Ausgänge einen Vektor darstellt, wie viel die Rechtecke überlappt.

public static Vector2 GetIntersectionDepth(this Rectangle rectA,                 Rectangle rectB)
    {
        //Calculate half sizes.
        float halfWidthA = rectA.Width / 2.0f;
        float halfHeightA = rectA.Height / 2.0f;
        float halfWidthB = rectB.Width / 2.0f;
        float halfHeightB = rectB.Height / 2.0f;

        //Calculate centers.
        Vector2 centerA = new Vector2(rectA.Left + halfWidthA, rectA.Top + halfHeightA);
        Vector2 centerB = new Vector2(rectB.Left + halfWidthB, rectB.Top + halfHeightB);

        //Calculate current and minimum-non-intersecting distances between centers.
        float distanceX = centerA.X - centerB.X;
        float distanceY = centerA.Y - centerB.Y;
        float minDistanceX = halfWidthA + halfWidthB;
        float minDistanceY = halfHeightA + halfHeightB;

        //If we are not intersecting at all, return (0, 0).
        if (Math.Abs(distanceX) >= minDistanceX || Math.Abs(distanceY) >= minDistanceY)
            return Vector2.Zero;

        //Calculate and return intersection depths.
        float depthX = distanceX > 0 ? minDistanceX - distanceX : -minDistanceX - distanceX;
        float depthY = distanceY > 0 ? minDistanceY - distanceY : -minDistanceY - distanceY;
        return new Vector2(depthX, depthY);
    }

Diese Funktion gibt negative zahlen basierten auf der Seite, aber ich kann nicht herausfinden, wie Sie Sie effektiv nutzen können. Ich habe versucht:

Vector2 overlap =   RectangleExtensions.GetIntersectionDepth(map.Dungeon[x,y].BoundingBox, player.BoundingBox);
if (overlap.X > 0) //This should be collision on the left
{
    //Move the player back
}

Jedoch dies bewirkt, dass einige seltsame bugs, vor allem, wenn Sie versuchen, das gleiche für die Y-player und map-Werte.

Die Frage: Wie kann die Kollisionserkennung durchgeführt werden monogame mit Rechtecken, würde Sie wissen lassen, auf welcher Seite war, kollidierte mit, die mit dieser Funktion oder sonst.

Vielen Dank für jede Hilfe!!!

InformationsquelleAutor T. Croll | 2015-04-26

Schreibe einen Kommentar