yの変更によるplayer.isFalling()の決定?


8

私は現在Box2Dを使用していて、私のキャラクターはBox2Dのフィクスチャの集まりです。プレーヤーが落ちているかどうかを判断するために、Y位置の変化を検出することが適切かどうか疑問に思っていましたか?

私が考えていない他の方法があるのでしょうか?この種のことは通常どのように検出されますか?


2
プレーヤーは落下を示す下向きの速度を持っていませんか?
共産主義者のダック

1
とにかくあなたの場合「落ちる」とは何ですか?単純な下降速度ですか?それは直下の固体表面の非存在ですか?キャラクターが建物から飛び降りてまだ上に向かっているときに「落下」しますが、明らかに数秒後にコンクリートにぶつかります。
Anko

@Akuのフェイリングは、ジャンプするのが意味をなさないときはいつでも起こります(ジャンプするサーフェスがないため)
jmasterx '06

3
通常、物理エンジンは、衝突の法線をチェックする方法を提供するはずです。「上」の場合、これはプレーヤーが何かの上に立っており、ジャンプできるはずであることを意味します。逆に、彼が衝突していない場合、またはどの衝突法線も「上」を指していない場合、彼は落下しています。
ジョナサンコネル2011年

@Duckと@ 3nixiosは良い答えのように聞こえますが、なぜそれを作らないのですか?。ehmの答え;)私は、
賛成票を投じる

回答:


9

(私のコメントから。)私はBox2Dに精通していませんが、通常、物理エンジンは衝突の正常性をチェックする方法を提供するはずです。

「上」の場合、これはプレーヤーが何かの上に立っており、ジャンプできるはずであることを意味します。

逆に、彼が衝突していない場合、またはどの衝突法線も「上」を指し示していない場合、彼は落下しています。


3

次の2つのブール値を必要とし、isColidingWithGroundかつisJumping

ユーザーがジャンプボタンを押したときに、でisColidingWithGroundありtrue、かつisJumpingfalseの場合、jump()whichに設定isJumpingしてtrue

プレイヤーの場合はy速度が正、その後でisJumping等号false

プレーヤーが地面に触れている場合true、isColidingWithGroundはに等しく、それ以外のisColidingWithGround場合はに等しくなりfalseます。

最初のジャンプインパルス後もプレーヤーが地面に接触している場合があります。これらの2つのフラグを使用すると、ジャンプが押されたときにjump()が複数回呼び出されるのを防ぐことができます。


この方法を使用すると、プレーヤーが落下しているときにジャンプキーが押されたかどうかを確認し、地面に触れる前に200ミリ秒ほど押された場合は、jump()もう一度呼び出します。
JCM 2013

2

これを処理する方法は、各プレーヤーがisJumpingブール値を持ち、ジャンプしたときにに設定されることtrueです。彼らが表面に衝突するとき、私は彼らが飛び降りることができるものであるかどうか、そして彼らが平らに立っているかなどの他の規定があるかどうかをチェックし、それをに設定しfalseます。

次に、彼らがジャンプしようとしたときに、彼らが乗っている表面が良くてisJumping == false私が彼らにジャンプすることを許可しているなら、そうでなければ彼らはジャンプできない。これは、ジャンプしているかどうかを確認するたびに衝突を計算するよりも優れていると思います。

編集
@BlueRajaが下で指摘したように、ユーザーが端から離れた場合、isJumpingそれでもになりますfalse。これはContact ListenerのEndContactメソッドで修正できます(9.4 項Box2D docsを参照)。ワールドとの衝突が終了したときにisJumpingプロパティをtrueに設定するだけです。


2
彼らがジャンプせずに端を離れて歩いたらどうなりますか? isJumpingになりますがfalse、彼らはまだジャンプすることを許可されるべきではありません
BlueRaja-Danny Pflughoeft

@BlueRaja-良い点。私はそれを忘れていました。衝突を壊すことについてのチェックもあります。Box2d DocsのEndContact 9.4を参照してください。更新された回答を編集します。
Richard Marskell-Drackir、2011年

0

「フィクスチャーの束」(一緒にプレーヤーを作る)内のすべての関連コンポーネントを少しだけ下に移動し、飛び降りることができると考えられるものとの衝突をチェックします。衝突がない場合、プレーヤーは落下しています。そうでなければ、彼はそうではありません。コンポーネントを同じ量だけ戻すことを忘れないでください。

キャラクターがヒューマノイドの場合は、移動してキャラクターの足だけを確認する必要があります。そうしないと、頭の上に立っていてもジャンプできる可能性があります。


0

これは当てはまる場合と当てはまらない場合がありますが、ジャンプ/ランディングと落下の違いを検出するため、落下アニメーションに切り替えるタイミングや、落下が長すぎる(遠すぎない;))などのダメージを与えることがわかっています。

これは、オブジェクトが参照ポイントなしでどのくらいの時間経過したかを追跡することでほぼ完了しました。地面上の何か、または他のオブジェクトは、それが立っていたものを参照していました。何かの上に立っていませんか?それからあなたは空中にいて、1-2秒後にあなたは優雅に着陸する代わりに「落下」していました:)


0

非常に単純かつ単純に、左上に(0,0)を使用していると仮定して、プレーヤーのy速度(速度ではなく速度)が0より大きいかどうかを確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.