ジャンプキーを長く押し続けると、プレーヤーをより高くジャンプさせるにはどうすればよいですか?私は現在、キーを押したままプレーヤーがジャンプしている限り、重力を減らしていますが、これは奇妙に見えます。
ジャンプキーを長く押し続けると、プレーヤーをより高くジャンプさせるにはどうすればよいですか?私は現在、キーを押したままプレーヤーがジャンプしている限り、重力を減らしていますが、これは奇妙に見えます。
回答:
最初に、ジャンプの外観を決定する必要があります。
実生活では、地面を離れた瞬間にジャンプの高さが決まります。すでに空中にいる間は、もっと高くジャンプし続けることはできません。
したがって、すでに空中にいるときにジャンプの高さを制御できる場合は、ある種の「ジェットパック」のような効果が得られます。
ジャンプの高さが2つあるサイドスクローラーを覚えているようですが、スーパーマリオゲームのひとつだったと思います。より高いジャンプは、ジャンプボタンを押したときに発生し、ジャンプは実際には2つの部分のジャンプで、最初の通常のジャンプから始まり、その後に2番目の衝撃が続きました。
では、ジャンプをどのように見せたいですか?プレイヤーがジャンプをどのように制御できるようにしたいですか?
私が始めるのはこれです:
重力をそのままにします(つまり、重力を変更しないでください)。プレイヤーがジャンプボタンを押すとき、プレイヤーがジャンプボタンを押している間(制限時間まで)ジャンプ力を適用します。その後、プレーヤーがジャンプボタンを放すと、最初に地面に触れるまでジャンプ力を再度適用することはできません(つまり、ジャンプを再開することはできません)。
super meat boy
すると、同じジャンプ効果があると思いますが、ジャンプボタンを押している間、フォースがキャラクターに適用されているように見えます。残りはalhovskyが言ったことのようなものです。そのようなものを実装する場合、ジャンプ力として60%〜80%の重力から始めます。
私は何人かの人々がこれをするのを見ました:
変数を作成します(これをと呼びますjumpTime
)(number / double / float)。ジャンプキーが押されたときに、jumpTime
ある数値に設定します(つまり、0.5
これは、ジャンプキーを押し続けることが影響する秒数になります)。
次に、すべてのステップで、速度をjumpTime
他の数値で乗算しjumpTime
、delta
(各ステップ間の時間差)で減少するように設定します。
jumpTime
ゼロ以下になるまで、またはプレイヤーがジャンプキーを離すまで、これを繰り返します。その後、通常の物理演算を使用します(プレイヤーが地面に着くまで一定の負の加速度を適用します)。
方法を知らない限り、試行錯誤(または「論理的推測」)を使用して、これらの「いくつかの数値」に適した値を見つける必要がある場合があります。
更新:私はジャンプをもう少し現実的にするトリックを発見しました(それは元々ゆっくりと上昇してから急速に下降するためです)。Infinite Marioは次の行(JavaScriptバージョンのCharacter.jsの293)も使用します。this.Ya *= 0.85;
これは単に「エアドラッグ」のようなものであり、空中でキャラクターの速度を制限/減速します。したがって、すべてのフレームで、y速度(垂直方向の速度)に1未満の数を掛けて、下降時に遅くなるようにします(したがって、ジャンプ中に上昇と下降の両方が似ており、より現実的になります)。私は説明が苦手です...
上記で最初に説明した方法を使用してキャラクターがジャンプする場合、キャラクターは「立ち上がり」よりも「立ち下がり」の方が速く立ち上がります。ただし、ドラッグにより垂直方向の速度が低下します。垂直速度をjumpTime
すべてのフレームに比例するように設定しているので、このドラッグはジャンプの前半にあまり影響を与えません。ただし、次の半分(下向きにフォールバック)では、垂直速度はフレームごとに設定されるのではなく、単に別の数値(この場合は重力定数)によって加算されます。したがって、落下時にドラッグが有効になり、速度が(任意の方向に)低下するため、落下が遅くなり、前半と同様になります。
この問題を解決する方法は他にもあります。たとえば、落下するときにキャラクターへの重力の影響を減らすなどです。ただし、重力をどれだけ減らすかを見つける必要があります。
これは私が見つけたものです(Markus Persson(Notch)によるMario.javaの206行目から):
if (keys[KEY_JUMP] || (jumpTime < 0 && !onGround && !sliding))
{
if (jumpTime < 0)
{
xa = xJumpSpeed;
ya = -jumpTime * yJumpSpeed;
jumpTime++;
}
else if (onGround && mayJump)
{
world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
xJumpSpeed = 0;
yJumpSpeed = -1.9f;
jumpTime = 7;
ya = jumpTime * yJumpSpeed;
onGround = false;
sliding = false;
}
else if (sliding && mayJump)
{
world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
xJumpSpeed = -facing * 6.0f;
yJumpSpeed = -2.0f;
jumpTime = -6;
xa = xJumpSpeed;
ya = -jumpTime * yJumpSpeed;
onGround = false;
sliding = false;
facing = -facing;
}
else if (jumpTime > 0)
{
xa += xJumpSpeed;
ya = jumpTime * yJumpSpeed;
jumpTime--;
}
}
else
{
jumpTime = 0;
}
JavaScriptのバージョンは基本的に同じですhttps://github.com/robertkleffner/mariohtml5/blob/master/code/character.js
これはOlhovskyの提案に似ていますが、この場合、力はプレイヤーがジャンプキーを押してから経過した時間に比例します。
if ( onGround && jump && !jumped ) {
jumpTime = maxJumpTime;
onGround = false;
jumped = true;
this.vel.y = jumpTime * jumpConstant;
A = true;
} else if ( !onGround && jump && jumpTime > 0 && !released ) {
jumpTime -= evt.delta;
this.vel.y = jumpTime * jumpConstant;
B = true;
} else if ( !onGround && ( !jump || jumpTime <= 0 ) ) {
this.vel.y -= gravityConstant * evt.delta;
jumpTime = 0
released = true;
} if ( this.pos.y < 0 && !A && !B ) {
onGround = true;
released = false;
this.pos.y = 0;
this.vel.y = 0;
}
if ( !jump && onGround ) jumped = false;
ただし、定数の一部の値(「gravityConstant」や「jumpConstant」など)は非現実的なジャンプを示します。しかし、ゲームは必ずしも現実的である必要はありません!(更新上記の更新セクションを参照してください)
この質問はもう1年以上前のものですが、お役に立てば幸いです。
Olhovskyが言ったように、ジャンプの高さはあなたが地面を去った瞬間に決定され、その後ではありません。
ジェットパック効果を本当に避けたい場合は、2つの方法しかありません。高くジャンプするためのキーの組み合わせ、またはジャンプキーの動作方法を根本的に変える方法です。
代わりにキーが押されるとすぐにプレイヤーのジャンプを作る、キーがされるまでのジャンプを遅らせるリリース。したがって、基本的にはキーを押す時間によって、プレーヤーの脚のスプリングテンションがどれだけ増加し、その後解放されるかが決まります。
もちろん、これはゲームの仕組みを根本的に変え、プレイヤーにとってなじみのないものかもしれません。しかし、その効果は非常に興味深いものであり、不慣れなことに価値があるかもしれません。
私は「質問へのデビッド・ゴーバイアの答えに、別の解決策を見つけたキャラクターをジャンプさせるためにどのように?」
彼のアイデアは、プレーヤーがジャンプボタンを押したときに速度を設定することでした。すべてのフレームで、重力のみを計算します。ただし、プレーヤーがボタンを離すと、速度がそれよりも大きい場合、速度が小さい値に設定されます。速度は、重力によって各フレームでのみ減分されます。
私は彼の答えを盗むべきではないので、先に進んで彼の投稿を読んでください。彼の解決策は、「可変高さジャンプ」セクションにあります。
本当に人々はこの問題を解決するために多くの異なる方法を考え出しました...
http://excitemike.com/JumpingControlTester(さまざまなゲームのさまざまなジャンプメカニズムを示します)
http://meyermike.com/wp/?p=175(マリオのジャンプパスについても説明)
http://www.flatredball.com/frb/docs/index.php?title=Tutorials:Platforer:Variable-Height_Jumps(3つの異なる方法について説明しています)
おそらくもっと(検索結果が多すぎることはありませんが、「可変ジャンプ高さ」をグーグルすると役立ちます)