Gute 2D-Platformer-Physik [geschlossen]

76

Ich habe einen grundlegenden Charakter-Controller für einen 2D-Plattformer mit Box2D eingerichtet und fange an, ihn zu optimieren, damit er sich gut anfühlt. Physik-Engines haben eine Menge Drehknöpfe zu tun, und es ist mir nicht klar, welche ich verwenden sollte, wenn ich zum ersten Mal mit einer Physik-Engine schreibe. Sollte das Springen eine Kraft für mehrere Zecken ausüben? Ein Impuls? Geschwindigkeit direkt einstellen? Wie verhindere ich, dass der Avatar an Wänden haftet, ohne dass die Reibung abnimmt (oder nehme ich die Reibung ab, aber nur in der Luft)? Soll ich den Charakter als Kapsel modellieren? Eine Box mit abgerundeten Ecken? Eine Box mit zwei Rädern? Nur ein großes Rad? Ich fühle mich wie jemand muss dies zuvor getan haben!

Es scheinen nur sehr wenige Ressourcen im Internet verfügbar zu sein, die nicht "Babys erste Physik" sind, und die alle aufhören, wenn ich hoffe, dass jemand die Probleme bereits gelöst hat. Die meisten Beispiele für Physikmotoren für Plattformfahrer verfügen über eine Steuerung mit Schwimmgefühl oder über Sprünge in der Luft oder über ein leicht ausnutzbares Verhalten, wenn das vorübergehende Eindringen zu hoch ist usw.

Einige Beispiele von dem, was ich meine:

  • Ein kurzer Sprungsprung springt eine kurze Strecke; ein langer Tipp springt höher.
  • Kurzes Schleudern beim Anhalten oder Umkehren mit hoher Geschwindigkeit.
  • Auf Steigungen stabil stehen (aber beim Ducken vielleicht nach unten rutschen).
  • Analoge Geschwindigkeit bei Verwendung eines analogen Controllers.
  • Alle anderen Dinge, die gute und schlechte Plattformer voneinander trennen.
  • Traue ich mich, stabile bewegliche Plattformen vorzuschlagen?

Ich bin nicht wirklich auf der Suche nach "Hey, mach das." Das Richtige hängt natürlich davon ab, was ich im Spiel will. Aber ich hoffe, irgendwo hat jemand die Möglichkeiten durchgesehen und gesagt: "Nun, Technik A hat X gut, Technik B hat Y gut, aber das funktioniert nicht mit C", oder es gibt einige Beispiele, die über "if (key =" hinausgehen = Leerzeichen) character.impulse (0, 1) "

Josh
quelle

Antworten:

25

Es ist ziemlich schwierig, eine "Mario-ähnliche" Physik mit einer echten Physik-Engine zu implementieren.

Als ich das letzte Mal mit Chipmunk versuchte, modellierte ich den Player als 2 Kreise - einen "Körperkreis" über einem "Fußkreis".

Der 'Fußkreis' hatte etwas Reibung, war nicht hüpfend und ziemlich klein. Der "Körperkreis" war größer und reibungslos, um ein Anhaften an Wänden / steilen Hängen zu vermeiden

Das Objekt war darauf beschränkt, keine Drehung zuzulassen - es rutschte einfach herum

Wenn die 'Füße' etwas berühren oder sich innerhalb der letzten Frames befanden (um das Herunterfallen von Hängen zu ermöglichen), wurde der Spieler als auf dem Boden befindlich betrachtet (möglicherweise wurde auch eine Oberflächennormalprüfung durchgeführt).

Es ist eine Weile her, dass ich mir den Code angesehen habe, aber das Verhalten war in etwa so:

Wenn am Boden:

  • "Zusätzliche Schwerkraft" anwenden (nach unten gerichtete Kraft, um beim Herunterfahren von Hängen zu helfen)
  • Bodenreibung anwenden (größeres Maß an horizontaler Dämpfung)
  • Wenden Sie die Kraft für die Bewegung nach links / rechts an, basierend auf den Steuerelementen.
  • (Verringern Sie die linke / rechte Bewegungskraft, um eine maximale Laufgeschwindigkeit zu erreichen.)
  • Wenn der Sprung gedrückt wird, wenden Sie einen Aufwärtsimpuls an

Wenn in der Luft:

  • Luftwiderstand anwenden (geringe horizontale Dämpfung)
  • Wenden Sie regelmäßige (oder reduzierte) Schwerkraft an
  • Wenden Sie eine Links- / Rechtsbewegung an, wenn Sie die Steuerung in der Luft zulassen

Sie müssen beim Umschalten zwischen den beiden Zuständen etwas vorsichtig sein - denken Sie daran, dass Sie beim Herunterfahren eines Abhangs den Boden für einige Frames verlassen können - Sie möchten an diesem Punkt wahrscheinlich nicht zwischen den Zuständen wechseln / nicht springen

Ein paar andere Dinge, auf die Sie achten müssen ... Jump-up-through-Plattformen können schwer zu implementieren sein, und wenn Sie anfangen, lustige Dinge zu tun (Plattformen bewegen, Welten drehen usw.), müssen Sie vorsichtig sein Vergewissern Sie sich, dass der Spieler nicht von beweglichen Objekten, die von einer Animation angetrieben werden, eingeklemmt oder zerdrückt wird.

Bluescrn
quelle
Ich weiß, das ist eine ziemlich alte Antwort, aber ich habe einige Fragen dazu. 1) Wie lösen Sie die "Gleiche Geschwindigkeit, egal auf welchem ​​Gelände Sie sich befinden"? 2) Wenn Sie einen kleinen Kreis für die Füße und einen größeren Kreis für den Körper verwenden, würde der Spieler dann nicht manchmal an Kanten hängen bleiben? Ihr Ansatz interessiert mich sehr.
Notbad
18

Ehrlich gesagt denke ich nicht, dass die Verwendung einer Physik-Engine der richtige Ansatz für etwas in dieser Größenordnung mit extrem strengen Anforderungen ist.

Schreiben Sie einfach alles selbst. Sie erhalten viel bessere Ergebnisse, wenn Sie in dieser Parabelform "Zeichen um x Einheiten nach oben bewegen, wenn Sie die Sprungtaste für die Länge y gedrückt halten" sagen, als wenn Sie eine Reihe von Knöpfen zum Ändern haben.

Tetrade
quelle
Ich habe das in der Vergangenheit schon mehrmals gemacht. Es funktioniert bis zu einem gewissen Punkt, aber am Ende wirft man immer etwas anderes raus, weil es "zu schwer" ist, die Physik mit einem hackigen Controller richtig zu machen. In diesem speziellen Spiel hoffe ich, einige Feder- / Seilmechaniker für die Bewegung des Spielers zu involvieren, und das ging über in den Bereich "Ich würde lieber eine echte Physik-Engine hacken" als "Ich würde lieber eine Kiste hacken" Urheber ".
3
Ich würde lieber einen Box Mover hacken, zumindest kann er nicht instabil werden, wohingegen eine Physik-Engine dazu neigt zu explodieren, wenn Sie zu viele Kräfte darauf ausüben, weil Sie Bewegungen auf exakte Spezifikationen beschränken müssen (und die Einschränkungen der Physik-Engine sind t starr, sie können nur versuchen, so viel zu erfüllen). Darüber hinaus beeinflusst die Anwendung von Kräften zur Lösung eines unerwünschten Problems in der Regel alles andere und führt zur Hölle.
Kaj
10

Ich habe eine Reihe von Artikeln über das Erstellen eines Plattformspiels von Grund auf mit modernen Technologien geschrieben. Darin ist enthalten, wie ich mit der einfachen Physik umgegangen bin:

http://www.wildbunny.co.uk/blog/2011/12/14/how-to-make-a-2d-platform-game-part-2-collision-detection/

Wenn Sie jedoch etwas High-Techeres wollen, ist es durchaus möglich, dies mit einer vollständigen Physik-Engine zu erreichen. Hier ist eine Technik, die Sie verwenden können (von Little Big Planet), die den Spielercharakter zu einem vollständig integrierten Teil der Physik-Engine macht:

Anstatt Impulse anzulegen oder Geschwindigkeiten einzustellen, um den Spieler als "externe Eingänge" für die Physik-Engine zu bewegen, können Sie eine Einschränkung entwickeln, die den Charakter steuert.

Diese Einschränkung hat also die gewünschte Geschwindigkeit und Richtung des Spielers als Eingabe (aus dem Spiel) und modelliert Dinge wie die maximale Stärke und Geschwindigkeit des Spielers. Die Einschränkung versucht, den Spieler gemäß seinen Eingaben (und unter Einhaltung der Maximalwerte) zu bewegen, und weil sie eine Einschränkung ist, übt sie eine gleiche und entgegengesetzte Kraft auf das Objekt aus, auf dem der Spieler steht, wodurch der Spieler auf sich bewegenden Plattformen stehen kann und die Dinge zu beeinflussen, über die er sich bewegt.

Wenn Sie solche Dinge tun, können Sie den Spieler auf ganz natürliche Weise in die Lage versetzen, Situationen zu meistern, in denen er sich unter einem riesigen Stapel von Kisten befindet oder über mehrere sich bewegende Plattformen springt, da er jetzt ein Kernbestandteil der Physik-Engine ist.

Ich hoffe, das hilft!

Prost, Paul.

wildbunny
quelle
6

Diese Frage wurde in den Box2D-Foren ausführlich diskutiert. Wenn Sie die Diskussionen über Charakterbewegung, Springen oder Plattformer lesen, werden Sie auf jedes mögliche Problem stoßen. Das Problem wurde jedoch so kompliziert, dass das Kollisionsfiltersystem aktualisiert und ein Testbed-Beispiel erstellt wurde, das nur zeigt, wie es durchgeführt werden sollte.

deft_code
quelle