Bestimmen von player.isFalling () durch Änderung von y?

8

Ich benutze derzeit Box2D und mein Charakter ist eine Reihe von Fixtures in Box2D. Ich habe mich gefragt, ob es angemessen wäre, eine Änderung der Y-Position festzustellen, um festzustellen, ob ein Spieler fällt.

Gibt es vielleicht andere Möglichkeiten, an die ich nicht denke? Wie wird so etwas normalerweise erkannt?

jmasterx
quelle
2
Hätte ein Spieler nicht eine Abwärtsgeschwindigkeit, um einen Sturz anzuzeigen?
Die kommunistische Ente
1
Was "fällt" in deinem Fall überhaupt? Ist es eine einfache Abwärtsgeschwindigkeit? Ist es eine nicht vorhandene feste Oberfläche unmittelbar darunter? Fallen Sie, wenn Ihr Charakter von einem Gebäude springt und immer noch nach oben fährt, aber in ein paar Sekunden offensichtlich auf den Beton trifft?
Anko
@ Aku Faling ist immer dann, wenn es für ihn keinen Sinn macht zu springen (da keine Oberfläche zum Abspringen vorhanden ist)
jmasterx
3
Normalerweise sollte eine Physik-Engine Ihnen Möglichkeiten bieten, die Normalität einer Kollision zu überprüfen. Wenn es "oben" ist, bedeutet dies, dass Ihr Spieler auf etwas steht und springen kann. Umgekehrt fällt er, wenn er nicht kollidiert oder wenn keine der Kollisionsnormalen nach oben zeigt.
Jonathan Connell
@ Ente und @ 3nixios klingt nach guten Antworten, warum nicht machen .. ehm Antworten;) Ich, für einen würde upvote
Maik Semder

Antworten:

9

(Aus meinem Kommentar.) Ich bin mit Box2D nicht vertraut, aber normalerweise sollte eine Physik-Engine Ihnen Möglichkeiten bieten, die Normalität einer Kollision zu überprüfen.

Wenn es "oben" ist, bedeutet dies, dass Ihr Spieler auf etwas steht und springen kann.

Umgekehrt fällt er, wenn er nicht kollidiert oder wenn keine der Kollisionsnormalen nach oben zeigt.

Jonathan Connell
quelle
3

Sie benötigen zwei Boolesche Werte isColidingWithGroundundisJumping

Wenn der Benutzer die Sprungtaste drückt, wenn isColidingWithGroundist trueund isJumpingfalsch ist, rufen Sie auf, jump()was isJumpingauf gesetzt isttrue

Wenn die yGeschwindigkeit des Spielers positiv ist, dannisJumping gleichfalse

Wenn der Spieler mit dem Boden kollidiert, ist isColidingWithGround gleich true, andernfalls ist isColidingWithGroundgleich false.

Manchmal ist der Spieler nach dem ersten Sprungimpuls immer noch in Bodenkontakt, und ich finde, dass durch die Verwendung dieser beiden Flags verhindert wird, dass jump () mehrmals aufgerufen wird, wenn der Sprung gedrückt wird.

AttackingHobo
quelle
Mit dieser Methode wäre es interessant zu überprüfen, ob die Sprungtaste gedrückt wurde, als der Spieler fiel, und wenn sie etwa 200 ms vor dem Berühren des Bodens gedrückt wurde, rufen Sie jump()erneut an.
JCM
2

Ich gehe damit um, dass jeder Spieler einen isJumpingBooleschen Wert hat, der beim Springen auf gesetzt ist true. Wenn sie mit einer Oberfläche kollidieren, überprüfe ich, ob es etwas ist, von dem sie abspringen können, und andere Bedingungen, wie z. B. stehen sie flach usw., und setze es auf false.

Wenn sie dann versuchen zu springen, ob die Oberfläche, auf der sie sich befinden, gut ist und isJumping == false ich ihnen erlaube zu springen, sonst können sie nicht springen. Ich denke, das ist besser, als jedes Mal Kollisionen zu berechnen, wenn Sie sehen wollen, ob sie springen.

Bearbeiten
Wie @BlueRaja weiter unten ausgeführt hat, wird der Benutzer isJumpingimmer noch sein , wenn er die Kante verlässt false. Sie können dies mit der Contact Listener- EndContactMethode beheben (siehe Abschnitt 9.4 Box2D-Dokumente . Sie müssen die isJumpingEigenschaft nur festlegen , truewenn die Kollision mit der Welt aufhört.

Richard Marskell - Drackir
quelle
2
Was ist, wenn sie von der Kante gehen, ohne zu springen? isJumpingwird sein false, aber sie sollten immer noch nicht springen dürfen
BlueRaja - Danny Pflughoeft
@ BlueRaja - Guter Punkt. Ich habe das vergessen, ich habe auch eine Überprüfung, ob Kollisionen gebrochen werden. Siehe EndContactin 9.4 aus den Box2d-Dokumenten . Aktualisierte Antwort bearbeiten .
Richard Marskell - Drackir
0

Bewegen Sie alle relevanten Komponenten in Ihrem "Bündel von Geräten" (die zusammen den Spieler bilden) um einen kleinen Betrag nach unten und prüfen Sie, ob Kollisionen mit irgendetwas auftreten, von dem Sie springen können. Wenn es keine Kollision gibt, fällt der Spieler. Sonst ist er nicht. Vergessen Sie nicht, die Komponenten um denselben Betrag zurückzuschieben.

Wenn Ihr Charakter humanoid ist, sollten Sie sich wahrscheinlich bewegen und nur die Füße des Charakters überprüfen, da Ihr Charakter sonst möglicherweise springen kann, selbst wenn er auf seinem Kopf steht!

Anko
quelle
0

Dies kann zutreffen oder auch nicht, aber wir würden einen Unterschied zwischen Springen / Landen und Fallen feststellen, sodass wir wussten, wann wir zu einer fallenden Animation wechseln müssen, Schaden anrichten, wenn Sie zu lange fallen (nicht zu weit;)) und dergleichen.

Dazu wurde nachverfolgt, wie lange ein Objekt ohne Referenzpunkt war. Irgendetwas auf dem Boden oder irgendein anderes Objekt hatte einen Hinweis darauf, worauf es stand. Nicht auf irgendetwas stehen? Dann warst du in der Luft und nach 1-2 Sekunden bist du 'gefallen' anstatt anmutig zu landen :)

James
quelle
0

Sehr naiv und einfach können Sie überprüfen, ob der Spieler eine y-Geschwindigkeit (Geschwindigkeit, nicht Geschwindigkeit) hat, die> 0 ist, vorausgesetzt, Sie verwenden (0,0) oben links.

Die kommunistische Ente
quelle