3

私は学習実験として2Dプラットフォーマーに取り組んでおり、現在、ジャンプロジックに少し問題があります。重力をプレーヤーに適用する必要があることを理解しています。これは、ジャンプと下降のプロセスに影響します。これが私が現在それをどのように実装しているかです。

isJumpingこれはbool、プレーヤーが上昇するか下降するか、現在ジャンプ中かどうかを知るために使用するものなので、再びジャンプすることはありません。

spriteJumpPositionは、プレーヤーがジャンプする高さを制限するために使用する値です(デフォルトは0、上限の10は以下にハードコードされています)。

void UpdateGravity()
    {
        // Check if player is currently jumping
        if (isJumping == true)
        {
            if (spriteJumpPosition < 10)
            {
                spritePosition.Y += (float)gravity;
                spriteJumpPosition += gravity;
            }
            else if ( spriteJumpPosition >= 10 )
            {
                isJumping = false;
                spritePosition.Y -= (float)gravity;
                spriteJumpPosition -= gravity;
            }
        }
        else if ( isJumping == false )
        {
            if (spriteJumpPosition > 0)
            {
                spriteJumpPosition -= (int)gravity;
                spritePosition.Y -= (float)gravity;
            }
        }
    }

上記のコードでは、現在の動作では、プレーヤーが少し下に移動し(おそらく、2〜3フレーム)、上に移動し始めますが、isJumping = false停止することはありません。私はここで何が間違っているのですか?これは、これを実行するための完全に間違った方法ですか?

4

2 に答える 2

12

かなり完全に間違っています、私は恐れています。位置速度加速度について知っていますか?

速度は、時間の経過に伴う位置の変化です。加速度は、時間の経過に伴う速度の変化です。重力は下向きの加速であるため、落下するにつれて物事は速くなります。

概念を説明するのに役立つ可能性のあるコードを次に示します。

Vector2 position;
Vector2 velocity;
readonly Vector2 gravity = new Vector2(0, -9.8f);

// Update:
float time = (float)GameTime.ElapsedGameTime.TotalSeconds;
velocity += gravity * time;
position += velocity * time;

このコードを使用してオブジェクトを上向きに撮影すると、(かなり)現実的な軌道を得ることができます。これはジャンプの良い出発点です。

ジャンプを開始する最も簡単な方法は、ジャンプキーが押されたときに上向きの速度を追加することです。上記のコードは、キャラクターを元に戻します。

ただし、優れたプラットフォーマーはジャンプの気分を良くするために多くのトリックを採用していることに注意してください。特に、ジャンプボタンが押された時間によってジャンプの高さを調整できるようにするためです。プレーヤーがすぐに下に移動し始めるようにすることで、これを応答性の高いものにすることが重要です。これを行う簡単な方法は、速度をゼロに設定し、プレーヤーが下に移動している間に追加の重力を適用することです。しかし、これは本当にあなたが調整しなければならないものです。

于 2013-03-03T09:30:55.660 に答える
0

衝突検出/応答に何を使用していますか?それは少し影響します。ただし、少なくとも速度と位置が必要です。例は次のとおりです。

class Player 
{
    Vector2 Position;
    Vector2 Velocity;
}

// in the constructor:

Position = new Vector2 (YOUR POSITION HERE);
Velocity = Vector2.Zero;

次に、各タイムステップに追加Velocityします(メソッドを作成し、デフォルトのメソッドから呼び出します)。次に、移動するときに、各タイムステップに追加します。たとえば、右のキーが押されたときはいつでも検出し、の部分に追加します。左のキーに対して反対の操作(減算)を行い、上下に変更します。これにより、まるで氷の上にいるかのようにスライド効果が発生します。重力の場合は、タイムステップごとにYパーツに少量を追加して、プレーヤーを「落下」させます。PositionPlayer.Update()UpdateVelocity0.5fXVelocityY

プレーヤーをジャンプさせる(簡単な方法)には、スペースを押すたびにY速度を-5または何かに設定するだけです。前述のように、キャラクターは上に移動し、最終的には「重力」のために下に移動します。

于 2013-03-03T10:01:58.253 に答える