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?
Antworten:
(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.
quelle
Sie benötigen zwei Boolesche Werte
isColidingWithGround
undisJumping
Wenn der Benutzer die Sprungtaste drückt, wenn
isColidingWithGround
isttrue
undisJumping
falsch ist, rufen Sie auf,jump()
wasisJumping
auf gesetzt isttrue
Wenn die
y
Geschwindigkeit des Spielers positiv ist, dannisJumping
gleichfalse
Wenn der Spieler mit dem Boden kollidiert, ist isColidingWithGround gleich
true
, andernfalls istisColidingWithGround
gleichfalse
.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.
quelle
jump()
erneut an.Ich gehe damit um, dass jeder Spieler einen
isJumping
Booleschen Wert hat, der beim Springen auf gesetzt isttrue
. 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 auffalse
.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
isJumping
immer noch sein , wenn er die Kante verlässtfalse
. Sie können dies mit der Contact Listener-EndContact
Methode beheben (siehe Abschnitt 9.4 Box2D-Dokumente . Sie müssen dieisJumping
Eigenschaft nur festlegen ,true
wenn die Kollision mit der Welt aufhört.quelle
isJumping
wird seinfalse
, aber sie sollten immer noch nicht springen dürfenEndContact
in 9.4 aus den Box2d-Dokumenten . Aktualisierte Antwort bearbeiten .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!
quelle
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 :)
quelle
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.
quelle