キャラクターをジャンプさせる方法は?


44

現在、Direct X 9.0を使用してC#でゲームを作成しています。ゲームのリメイクはドンキーコングNESです。私はほぼすべてを完了しましたが、マリオのジャンプの物理学に問題があります。YとXの調整用に宣言された変数があります。

これを行う簡単な方法があるかどうか疑問に思っていました。高いものと低いもので答えを探しましたが、見つかった答えは無関係であるか、XNAなどの別のプログラミング言語を使用しています。

現在、Wが押されたかどうかを確認するためにbool変数が設定されており、Wが押されると、コードをトリガーしてジャンプさせます。などをいじっています。

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

うまくいきませんでした。私は答えを求めて高低を検索しましたが、今は誰かが簡単な解決策の正しい方向に私を向けることができれば、私は必死です。それは素晴らしいことです。どんな反応にも感謝します。


5
別のプログラミング言語を使用した回答は問題になりません。アルゴリズムは特定の実装ではなく、興味のあるものです...何も理解せずにコピー&ペーストしたいだけでない限り、私はあなたがそうでないことを願っています!他のプログラミング言語のアルゴリズムを読み取って適応できることは、非常に優れたスキルです。
ccxvii

回答:


84

まず、XNAもC#を使用しているため、同じプログラミング言語です。また、基になるAPIはDirectXとは多少異なる場合がありますが、ジャンプとは関係がないため、同じチュートリアルまたは回答をここで適用する必要があります。また、多くの要因に応じて、これを実装する方法は多数あります。以下で説明するのは、可能性の1つにすぎません。

基本的な物理的要件

最初に、更新ループでいくつかの基本的な物理変数と計算が必要です。特に、位置、速度、重力を定義する必要があり、更新ループはこれとほぼ同様の処理を行う必要があります(簡単のため、衝突検出と応答は省略されています)。

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

固定高さジャンプ

これで、キーをどれだけ押しても、常に同じ高さのジャンプを実装する最も簡単な方法は、垂直速度を1回変更することです。これにより、キャラクターが上昇し始め、重力が自動的にキャラクターを倒します。

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

重要キャラクターが地面にいない場合、ジャンプを開始できないようにするため、そのためのチェックを追加する必要があります。

可変高さジャンプ

しかし、マリオやソニックのようなゲームには可変ジャンプがあり、ジャンプの高さはボタンを押し続ける時間に依存します。この場合、ジャンプキーを押したり放したりする必要があります。次のようなものを追加できます。

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

上記のコードでこれらの値(つまり0.5-12.0fまたはなどの数値-6.0f)をすべて微調整することで、ジャンプの感触、ジャンプの高さ、ジャンプボタンを放した後もどれだけの勢いを維持するか、落下する速さなどを変更できます。

重要これらの関数をフレームごとに呼び出さないでください。キーを押すか放したときに一度だけ呼び出します。そうしないと、キャラクターがジャンプする代わりに飛んでしまいます。

実施例

ここでブラウザで試すことができる上記のテクニックの簡単な例を作成しました(マウスボタンを押してジャンプし、途中で放してジャンプの高さを制御します)。JSにありますが、前述のように、この場合、言語は無関係です。

http://jsfiddle.net/LyM87/


11
数日前に書かれたこの素晴らしい記事を、このトピックに関連する情報と共有する機会を得るかもしれません:2Dプラットフォーマーの実装ガイド。そしてこれも:ソニックジャンプ
デヴィッドゴーベイア

2
この記事では、回答で行ったのとは異なる変数ジャンプの方法について説明しています。重力を抑えるか、ボタンを押したままインパルスを追加し続ける必要があります。私は通常、Davidが彼の答えで言うことをしますが、記事の方法に何か考えはありますか?
ジェフ

@Jeffそれも私の注意を喚起し、まさにそれを実装する複数の方法があると述べた理由です。最初の記事では、同じ問題を処理する2つの追加の方法について説明しますが、私が説明した方法は2番目の記事に基づいています。どれを実装するのも非常に簡単ですが、どのように互いに比較するのかわかりません。結局、この方法を選択したのは、説明が簡単で、タイマーを追加したり、規模が小さくなる複数のインパルスを処理したりする必要がなかったからです。
デヴィッドゴーベイア

答えは、特定のゲームとやりたいアニメーションの数によって異なります。Metroidは、一定速度のジャンプ:/下降を使用しますが、高品質のアニメーションでマスクし、天頂で滑らかで「曲線」に見えるようにします。他の多くのプラットフォーマーは、可変速ジャンプを使用します。
ショーンミドルディッチ

1
5年後、これは非常に役に立ちました:)そして、このフィドルなことは非常にクールです-JSを学ぶ必要があります!
流動性

1

物理学のように。を押しjump keyてキャラクターが地面にいる瞬間のみ、速度を上げます(インパルスと呼ばれます)が、キャラクターは常に重力によって落下します。

地面にぶつかるたびにキャラクターをジャンプさせたくない場合-保持しているためjump key- jump key is being pressedクリアした変数を追加し、jump keyリリース後に設定します。擬似コード:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

あなたの方法を使用した場合:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

どのようdonkey.yに変化するかはあなたの想像次第です。Velocityは、見栄えを良くするために、空中にあるより小さな重荷ロバを取得する必要があります。

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