まず、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/