Mit XNAs in Intersects () auf zwei Rechtecken kann ich eine Kollision erkennen und meine Geschwindigkeit auf Null setzen. Das Objekt steckt jedoch dort fest und kann nicht raus! Wie kann ich diese Kollision richtig beheben?
quelle
Mit XNAs in Intersects () auf zwei Rechtecken kann ich eine Kollision erkennen und meine Geschwindigkeit auf Null setzen. Das Objekt steckt jedoch dort fest und kann nicht raus! Wie kann ich diese Kollision richtig beheben?
Dies liegt daran, dass Sie, sobald Ihr Objekt in die Wand gelangt und Sie die Kollision gefunden haben, die Bewegung des Objekts einfach stoppen, indem Sie seine Geschwindigkeit auf Null setzen, das Objekt jedoch stillsteht innerhalb dieser Wand.
Um dies zu beheben, müssen Sie die Kollision durch Verschieben des Objekts beheben . Sie haben hier zwei Möglichkeiten:
Implementierung der zweiten Option
Hier werde ich davon ausgehen , dass die Geschwindigkeit , die Richtung darstellt , in dem das Objekt wird (im Grunde , dass Sie nicht die Geschwindigkeit Wechsel zwischen der Positionsänderung des Objekts und der Kollisionsprüfung). Ich gehe auch davon aus, dass sich Ihr Ursprung oben links im Bild befindet (wenn Sie also das Objekt bewegen, um die Kollision zu beheben, positioniere ich die obere linke Ecke).
So würde ich es machen:
if (objRect.Intersects(wallRect)) // If there is a collision
{
Vector2 newPos = obj.Position;
if (obj.Velocity.X > 0) // object came from the left
newPos.X = wallRect.Left - objRect.Width;
else if (obj.Velocity.X < 0) // object came from the right
newPos.X = wallRect.Right;
if (obj.Velocity.Y > 0) // object came from the top
newPos.Y = wallRect.Top - objRect.Height;
else if (obj.Velocity.Y < 0) // object came from the bottom
newPos.Y = wallRect.Bottom;
obj.Position = newPos;
}
Sie können auch die Position des alten Objekts verwenden, um herauszufinden, woher das Objekt stammt. In diesem Fall ist die Verwendung der Geschwindigkeit jedoch einfacher.
Sie können dies auf verschiedene Arten tun.
Eine Methode besteht darin, die vorherige Position des Rechtecks in jedem Frame zu speichern. Wenn sich Ihre Rechtecke überschneiden, setzen Sie einfach die Objektposition auf die ältere, die nicht kollidiert. Diese Methode ist nicht die beste, da bei hoher Rechteckgeschwindigkeit möglicherweise die Neupositionierung angezeigt wird, die Sie über Code vorgenommen haben.
Eine andere Methode ist das Testen der Kollision mit einem Raycast, sodass Sie eine Vorschau einer Kollision anzeigen können, bevor sie jemals auftritt.
Schauen Sie sich msdn an, um eine Dokumentation für die Raycast-Kollision zu erhalten, und Sie werden dies tun können.
quelle