サイドスクローラーの可変高さジャンプ


10

ジャンプキーを長く押し続けると、プレーヤーをより高くジャンプさせるにはどうすればよいですか?私は現在、キーを押したままプレーヤーがジャンプしている限り、重力を減らしていますが、これは奇妙に見えます。


たぶん、重力をどの程度減らすかを少し変更するだけで、より良いジャンプアクションが得られます。
Ali1S232 2011年

@Gajetそれはかなり不格好で、奇妙な方法のようです。
共産主義者のアヒル

うーん、重力を減らすということは、物理エンジンを使用しているという意味ではありません。これは事実ですか?ジャンプにインパルスを使用していますか?
ジョナサンコネル2011年

物理エンジンはなく、
Impulses

その場合、プレーヤーはどのように落ちますか?動き*ジャンプ*重力ベクトルに従って彼の位置を変換しますか?
ジョナサンコネル

回答:


9

最初に、ジャンプの外観を決定する必要があります。

実生活では、地面を離れた瞬間にジャンプの高さが決まります。すでに空中にいる間は、もっと高くジャンプし続けることはできません。

したがって、すでに空中にいるときにジャンプの高さを制御できる場合は、ある種の「ジェットパック」のような効果が得られます。

ジャンプの高さが2つあるサイドスクローラーを覚えているようですが、スーパーマリオゲームのひとつだったと思います。より高いジャンプは、ジャンプボタンを押したときに発生し、ジャンプは実際には2つの部分のジャンプで、最初の通常のジャンプから始まり、その後に2番目の衝撃が続きました。

では、ジャンプをどのように見せたいですか?プレイヤーがジャンプをどのように制御できるようにしたいですか?

私が始めるのはこれです:

重力をそのままにします(つまり、重力を変更しないでください)。プレイヤーがジャンプボタンを押すとき、プレイヤーがジャンプボタンを押している間(制限時間まで)ジャンプ力を適用します。その後、プレーヤーがジャンプボタンを放すと、最初に地面に触れるまでジャンプ力を再度適用することはできません(つまり、ジャンプを再開することはできません)。


試してみたところ、ジェットパック効果が出ました それを避ける方法はないかと思っていました。
John Stimac

1
たぶん、あなたが考えているゲームではないかもしれませんが、スーパーマリオ2では、ジャンプする前に少しダッキングすることでより高くジャンプしました。(これは、直立した位置から直接ジャンプしようとすると、あまり遠くにジャンプしないため、ある程度直感的に理解できます。)
Darien

3
Jcubed:速度に力を加える代わりに、力を位置に直接加えてみてください。その後、プレイヤーは加速するのではなく、直線的に上昇します。
Olhovsky

@Jcubed:のようないくつかのゲームをプレイsuper meat boyすると、同じジャンプ効果があると思いますが、ジャンプボタンを押している間、フォースがキャラクターに適用されているように見えます。残りはalhovskyが言ったことのようなものです。そのようなものを実装する場合、ジャンプ力として60%〜80%の重力から始めます。
Ali1S232 2011年

1
私はいつもこれを行っています。ボタンを押し続けることでジャンプの上昇速度を設定する時間を十分に短くして、ジェットパックの効果が目立たないようにしてください。そうすれば、いくつかの魔法でスーパーマリオのようになります数の微調整。「力」を小さくしないでください。jumpHigherTimeが期限切れになるか、プレーヤーがボタンを離すまで、速度を最大jumpspeedにリセットし続けてください。また、プラットフォームのジャンプと同様に、ジャンプするスーパーミートボーイは不正確で迷惑な感じがします。物理エンジンにのみ依存している; p
Oskar Duveborn

7

私は何人かの人々がこれをするのを見ました:

  1. 変数を作成します(これをと呼びますjumpTime)(number / double / float)。ジャンプキーが押されたときに、jumpTimeある数値に設定します(つまり、0.5これは、ジャンプキーを押し続けることが影響する秒数になります)。

  2. 次に、すべてのステップで、速度をjumpTime他の数値で乗算しjumpTimedelta(各ステップ間の時間差)で減少するように設定します。

  3. jumpTimeゼロ以下になるまで、またはプレイヤーがジャンプキーを離すまで、これを繰り返します。その後、通常の物理演算を使用します(プレイヤーが地面に着くまで一定の負の加速度を適用します)。

方法を知らない限り、試行錯誤(または「論理的推測」)を使用して、これらの「いくつかの数値」に適した値を見つける必要がある場合があります。


更新:私はジャンプをもう少し現実的にするトリックを発見しました(それは元々ゆっくりと上昇してから急速に下降するためです)。Infinite Marioは次の行(JavaScriptバージョンのCharacter.jsの293)も使用します。this.Ya *= 0.85;これは単に「エアドラッグ」のようなものであり、空中でキャラクターの速度を制限/減速します。したがって、すべてのフレームで、y速度(垂直方向の速度)に1未満の数を掛けて、下降時に遅くなるようにします(したがって、ジャンプ中に上昇下降の両方が似ており、より現実的になります)。私は説明が苦手です...

上記で最初に説明した方法を使用してキャラクターがジャンプする場合、キャラクターは「立ち上がり」よりも「立ち下がり」の方が速く立ち上がります。ただし、ドラッグにより垂直方向の速度が低下します。垂直速度をjumpTimeすべてのフレームに比例するように設定しているので、このドラッグはジャンプの前半にあまり影響を与えません。ただし、次の半分(下向きにフォールバック)では、垂直速度はフレームごとに設定されるのではなく、単に別の数値(この場合は重力定数)によって加算されます。したがって、落下時にドラッグが有効になり、速度が(任意の方向に)低下するため、落下が遅くなり、前半と同様になります。

この問題を解決する方法は他にもあります。たとえば、落下するときにキャラクターへの重力の影響を減らすなどです。ただし、重力をどれだけ減らすかを見つける必要があります。


ケーススタディ:Infinite Mario

これは私が見つけたものです(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の提案に似ていますが、この場合、力はプレイヤーがジャンプキーを押してから経過した時間に比例します。

私のJavaScriptバージョン:

    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年以上前のものですが、お役に立てば幸いです。


2

Olhovskyが言ったように、ジャンプの高さはあなたが地面を去った瞬間に決定され、その後ではありません。

ジェットパック効果を本当に避けたい場合は、2つの方法しかありません。高くジャンプするためのキーの組み合わせ、またはジャンプキーの動作方法を根本的に変える方法です。

代わりにキーが押されるとすぐにプレイヤーのジャンプを作る、キーがされるまでのジャンプを遅らせるリリース。したがって、基本的にはキーを押す時間によって、プレーヤーの脚のスプリングテンションがどれだけ増加し、その後解放されるかが決まります。

もちろん、これはゲームの仕組みを根本的に変え、プレイヤーにとってなじみのないものかもしれません。しかし、その効果は非常に興味深いものであり、不慣れなことに価値があるかもしれません。


2
まさにそのメカニズムでプラットフォーマーをプレイしたことを覚えていると思います。ジャンプを「チャージ」するまで地面を離れないでください。いくつかのかわいいアニメーション(キャラクターの足元でほこりの雲が成長するなど)を使用すると、これを直感的に感じることができます。
Jari Komppa、2011年

2

私は「質問へのデビッド・ゴーバイアの答えに、別の解決策を見つけたキャラクターをジャンプさせるためにどのように?

概要:

彼のアイデアは、プレーヤーがジャンプボタンを押したときに速度を設定することでした。すべてのフレームで、重力のみを計算します。ただし、プレーヤーがボタンを離すと、速度がそれよりも大きい場合、速度が小さい値に設定されます。速度は、重力によって各フレームでのみ減分されます。

私は彼の答えを盗むべきではないので、先に進んで彼の投稿を読んでください。彼の解決策は、「可変高さジャンプ」セクションにあります。

本当に人々はこの問題を解決するために多くの異なる方法を考え出しました...

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