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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Rechteck Klasse in XNA hat 4 Eigenschaften, die von nutzen sein können hier:
Links, Top, Rechts und Unten.
Können Sie diese verwenden, um zu bestimmen, welche Seite(N) die Kollision stattgefunden hat.
Betrachten Sie zum Beispiel die
Player.Rectangle.Left > Map.Rectangle.Left
. Wenn das wahr ist, dann ist die Kollision hätte herrschten auf der rechten Seite (der linken Seite der Spieler ist größer auf der X-Achse als die Karte, das bedeutet, dass der Spieler, der rechts von der linken Punkt von der Karte).Grundsätzlich können Sie vergleichen die X-und Y-Koordinaten der beiden Rechtecke. Abgesehen von den seltsamen Fällen (wie einem Rechteck wird untergetaucht völlig in der anderen, oder ein Rechteck, ein super-set von den anderen), diese sollten ausreichend sein, zu sagen, die Seite die Sie collisioned auf.
Einen besseren Weg, um dies zu überprüfen wäre, indem er der Mitte-Punkt der beiden Formen, dass kann auch ein einfacher Weg, zu sagen, die relative Positionierung der beiden Objekte.
Nun, obwohl es ist in 3D, finden Sie möglicherweise dieser Beitrag hilfreich.
Froh, ich könnte Ihr problem lösen 😀
InformationsquelleAutor Nahuel Ianni