Plattform und Physik
Diese Randfälle sind zahlreich. Gute, lustige Plattformer verhalten sich in keiner Weise physisch korrekt, und die Kontrolle und das Verhalten, die Spieler nach Jahren "perfekter" Plattformer wie Mario erwarten, sind mit allgemeinen Techniken, wie sie mit Box2D oder anderen Physik-Engines möglich sind, unglaublich schwierig zu implementieren. Die meisten guten Plattformer verwenden keine generische Physik oder Kollisionsreaktion in ihren Player-Controllern.
Rümpfe erzeugen
Bezüglich Ihrer spezifischen Frage ist es die beste Lösung, keine Boxen mehr als Grundlage zu verwenden. Verwenden Sie eine Reihe verbundener Liniensegmente (einen Rumpf). Dadurch kann sich die Kollisionserkennungs-Engine nur auf die tatsächlich begehbaren Flächen konzentrieren und nicht auf die "gefälschte" Kante zwischen AB und BC. Genau das macht Box2D. Die Formen werden verwendet, um die äußeren Oberflächen zu erzeugen, die miteinander verbunden sind, um einen Rumpf zu bilden.
Sie benötigen dies auch in kachelbasierten Spielen oder in Situationen, in denen zwei AABB-Objekte nebeneinander als Boden fungieren. Die Kollisionsmaschine nimmt diese vertikalen Kanten auf und veranlasst den Spieler, sie einzufangen. Es gibt Hacks, die helfen können, aber das Problem nicht beseitigen. Die Lösung besteht darin, nur ein einziges Liniensegment zu haben, das die Oberfläche darstellt, und nicht eine vollständige 2D-Box.
Sie können die Rümpfe im generischen Fall generieren, indem Sie die Polygone gegeneinander abschneiden und die Schnittpunkte zu einer Kantenliste zusammenfügen.
Schräge Flächen
Da Ihr Beispiel eine Neigung enthält und Sie die Wiederherstellung und andere physikalische Eigenschaften erwähnen, werde ich auf einige andere Probleme hinweisen, die Sie bald bemerken werden. Dies zeigt weiter, warum die generische Kollisionserkennung und -reaktion für Plattformfahrer nicht gut funktioniert. Versuchen Sie zunächst, auf der abgewinkelten Plattform zu stehen, aufzuspringen und dann zu landen. Sie werden wahrscheinlich bemerken, dass der Charakter bei der Landung etwas "rutscht". Das Problem ist, dass die Kontaktnormale, die Sie erzeugen, normalerweise von der abgewinkelten Oberfläche ausgeht. Bei der Lösung der Kollision wird der Spieler dann in diese Richtung hinausgeschoben. Obwohl der Charakter gerade heruntergefallen ist, wird er bei der Landung nach oben und ein wenig nach rechts geschoben, was zum Rutschen führt. Dies kann gehackt werden, indem die relativen Geschwindigkeiten berücksichtigt werden,
Das zweite Problem, das Sie bemerken werden und das viel schwerer zu beheben ist, ist das, was passiert, wenn Sie versuchen, schnell eine Rampe hinunter zu rennen. Der Spieler "hüpft" die Rampe hinunter. Dies ist selbst in den meisten heutigen AAA-Spielen sehr gut sichtbar. Es sieht nicht nur albern aus, aber wenn Ihr Spiel erfordert, dass der Spieler auf dem Boden steht, um zu springen, ist es schwierig, eine Rampe herunterzulaufen und auf halber Höhe herunterzuspringen, da der Spieler die Rampe nur während eines kleinen Abschnitts der Rampe berührt Zeit damit verbracht, es runterzugehen. Eine einfachere Lösung besteht darin, einfach einige Strahlenschläge auszuführen, wenn sich der Spieler bewegt, und die Spielerposition auf die nächstgelegene Oberfläche (wenn sie sich sehr nahe am Spieler befindet) abzusenken, wenn der Spieler nicht springt und zuvor auf dem Boden war.
Sie können auch feststellen, dass der Spieler beim Hochfahren einer Rampe in die Luft startet, wenn Sie versuchen, Geschwindigkeit, Reibung und Rückstellung auf dem Spieler so zu modellieren, als ob er ein normaler starrer Körper wäre. Die Bewegung des Spielers sollte auf horizontale Bewegungen beschränkt sein, es sei denn, er fällt oder springt. Wenn Sie mit älteren Plattformspielern aus dem Goldenen Zeitalter spielen, stellen Sie möglicherweise fest, dass die Horizontalgeschwindigkeit des Spielers zwischen horizontalen und geneigten Oberflächen häufig konstant ist. Dies muss auch beim Auf- und Absteigen berücksichtigt werden.
Es wird auch eine Reihe anderer seltsamer Fälle geben, denen Sie irgendwann begegnen werden. Wenn Sie versuchen, einen guten Plattformer zu entwickeln, ist es wirklich das Beste, einen Platformer-Player-Controller zu implementieren, der von der Physik getrennt ist und das gewünschte Bewegungs- und Steuerverhalten fest codiert, anstatt sich auf allgemeine Physik und Kollisionsreaktionsalgorithmen zu verlassen.