衝撃ジャンプ


12

私を困惑させていることが1つあります。それは、プラットフォーマーで「フェイクインパルス」ジャンプを実装する方法です。私が何を話しているのかわからない場合は、マリオ、カービー、Cave Storyからの引用のジャンプを考えてください。彼らの共通点は何がありますか?さて、ジャンプの高さは、ジャンプボタンを押し続けている時間によって決まります。

これらのキャラクターの「インパルス」は、実際の物理学のようにジャンプする前ではなく、空中で構築されていることを知っています-つまり、最大高さの途中で指を非常にうまく持ち上げることができ、それとフルストップの間の減速。ホップをタップして長押しするだけでいいのは、そのためです。彼らが軌道をアークとして保持していることに魅了されます。

私の現在の実装は次のように機能します:

ここに画像の説明を入力してください

ジャンプボタンを押している間、重力はオフになり、アバターのY座標は重力の一定値だけ減少します。たとえば、物がティックごとにZ単位で落ちる場合、ティックごとにZ単位上昇します。

ボタンを放すか、制限に達すると、アバターは、速度が0に達するまでXユニットをカバーする量で減速します。一度、速度が重力に一致するまで加速します-例に固執すると、Xユニットをカバーしながら0からZユニット/ティックまで加速すると言えます。

ただし、この実装では、ジャンプが対角線になりすぎ、アバターの速度が重力よりも速くない限り、現在のプロジェクトでは速度が速すぎます(ティックごとに約4ピクセルで移動し、重力はティックごとに10ピクセルです) 40FPSのフレームレート)、水平よりも垂直になります。プラットフォーマーに精通している人は、ゲームの重力ほど速くなくても、キャラクターのアークジャンプはほとんど常に彼らがさらにジャンプすることを可能にし、それが正しくプレイされない場合、それ自体が証明されることに気付くでしょう非常に直感に反します。私の実装が非常に迷惑であることを証明できたので、私はこれを知っています。

ここに画像の説明を入力してください

誰かが同様のメカニズムを試したことはありますか?この種のプラットフォーマージャンプの背後にあるものを知りたいです。事前にこれを経験したことがなく、試してみたい場合は、説明された実装を修正または強化しようとしないでください、私が正しい方法でなかった場合-から解決策を作ってみてくださいスクラッチ。これらの擬似インパルスがどのように機能するかを示している限り、重力、物理学、その他を使用するかどうかは気にしません。

また、言語固有のコーディングを避けるためにそのプレゼンテーションが欲しいです。たとえば、C ++の例を共有したり、Delphiを使用したりします。プロジェクトにXNAフレームワークを使用していて、C#のことを気にしない限り、他のコードを読むのに忍耐はありません。他の言語の特定のゲーム開発者はここで達成することに興味があるので、擬似コードにこだわる必要はありません。

よろしくお願いします。


3
次の質問とその回答をご覧になりましたか?gamedev.stackexchange.com/questions/29617/...
bummzack

@bummzackこれも非常にクリアです。
武藤

1
ジャンプ処理と重力の重複の可能性きれいな写真はありませんが、それは同じ質問です。
マイケルハウス

回答:


8

あなたの主な問題はここにあると思います:

ジャンプボタンを押している間、重力はオフになり、アバターのY座標は重力の一定値だけ減少します。たとえば、物がティックごとにZ単位で落ちる場合、ティックごとにZ単位上昇します。

重力はそのようには機能しません。グーグルは詳細については「均一に加速された動き」をしているが、簡単に言えば、他の仲間のメンバーが言ったように、重力は速度ではなく加速である。

速度はの一定の変化率である一方、簡単に言えば、位置時間をかけて、加速がの一定の変化率である速度時間をかけて。

したがって、ビジネスの最初の順序は、速度だけでなく加速を含むように落下アルゴリズムを変更することです。の代わりに:

pos_y = pos_y + (velocity_y * time_difference)

あなたは次のようなことをしなければなりません

pos_y = pos_y + (velocity_y * time_difference) + (gravity_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (acceleration_y * time_difference)

そうすることで、すべてが放物線になります。これは物理的に正しい動きです。

ここで、単純なジャンプを実装するには(この直後に正確な質問に進みます)、単にvelocity_y目的の値に設定します。記号acceleration_yと目的の記号velocity_yが異なる限り、オブジェクトは正しくジャンプします(つまり、「重力をオフにする」ことはありません。それを維持し、オブジェクトの速度を定義済みの値に設定するだけです)。

velocity_yジャンプを始めたときのジャンプが大きいほど、ジャンプが高くなることに気付くでしょう。したがって、目的の効果を実現するには、ジャンプに何らかの加速を追加します(物理的には、これは力を追加することを意味します。オブジェクトに小さなロケットを追加することを考えてください)。

これを行うには、以前と同じことを行いますが、今では加速度と速度は同じ符号を持つ必要があります。ボタンが押されている間にこれを行います:

pos_y = pos_y + (velocity_y * time_difference) + (force_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (force_y * time_difference)

4

解決策は、減速を遅らせないことです。空中にボールを投げると、ボールは最大の高さに達するまで一定の速度で動きませんが、衝動の瞬間から減速します。

重力は速度ではなく、加速です。そのため、プレーヤーの速度が20ユニット以上で、重力が-10ユニットの場合、次のティックでは、速度は10ユニット、次のユニットでは0ユニットなどになります。

ジャンプが非常に斜めに見える理由は、プレイヤーのスピードが一定であるためです。したがって、プレイヤーのパスに沿って文字通り線を引くと、x位置の変化に対する重力値の勾配が正または負の線が表示されます。

プレイヤーがジャンプの高さを制御するには、プレイヤーにインパルスの初期速度を与え、重力をオフにし、特別な重力値(通常の重力より小さい)をプレイヤーの速度に適用する必要があります。ジャンプボタンを放すか、プレイヤーの速度が0に達すると、通常の重力が適用されます。

このようにして、プレーヤーは、通常の重力で減速しているかどうかにかかわらず、ジャンプ中に素敵な曲線を見ることができます。


2

短い話は次のとおりです。ジャンプアークのどこかに非放物線状のセクションがあります。

ジャンプを実装するときに、いくつかのアプローチを試しました。

  • 一定の上昇:これは実際には、あなたが試みていたものであるように見えます:ボタンが離されるまで正の垂直速度を固定し、その時点で通常の重力が働き始めます。これは実際には通常は正常に見えますが、ジャンプの高さを適切に判断するのは非常に簡単なので、(より重要なことに)OKに感じます。

  • 逮捕された上昇:これは、キャラクターを最大高さの放物線で上昇を開始し、最初の衝動を加えます。次に、ボタンを放したときに、垂直速度をゼロ(または小さな上方向の速度)に設定します。つまり、最大ジャンプは放物線が保証されており、小さなジャンプは大きなジャンプをして減速するように感じます。

  • 可変初期インパルス:これは私が選択したものです:ジャンプを押すと、ホップに十分な初期上向きのインパルスが適用され、その後、短時間-ジャンプウィンドウ-まで上向きの加速度(重力よりもはるかに大きい)が適用されますボタンがリリースされました。ジャンプウィンドウが閉じると、モーションは放物線になり、可変初期インパルスの期間は奇妙に見えない程度に短かったが、経験豊富なプレーヤーにジャンプの高さを制御するのに十分な範囲を与えるには十分に長かった。欠点は、ジャンプの高さを判断するのが簡単ではなかったことです。ウィンドウがはるかに小さく、リリースの瞬間と高さの対応がなかったためです。ほとんどの場合、タップまたはフルジャンプが必要でしたが、それは問題ではありませんでした。

これらを試して、どれが一番いいかを見てください。

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