1

これらの式のジャンプサイズは、1秒あたりの更新量が少なくなるにつれて小さくなります。重力とジャンプ速度の力が減少する量を乗算するデルタ値、および反復ごとにデルタが加算される経過時間(デルタ値は最後の更新から経過したミリ秒の量)を使用すると、正常に機能すると思います。

//d is delta
...
if(isFalling||isJumping){

        elapsedTime +=d;
//the elapsed time is the total amount of time passed since one started jumping,
//so that's logical to add the amount of time since last update.

        long tesquared = (long) Math.pow(elapsedTime, 2);
//amount of time elapsed squared.

        jumpSpeed+=-0.0000005*elapsedTime*d;
//this is the amount that jumpspeed is taken down by every time. 

        if(jumpSpeed > 0){
            isJumping = true;
        } else {
            isJumping = false;
        }
        double fGravity = 0.0000001*tesquared*d;

// this is the equation for gravity, the amount that the player goes down

        yRend += jumpSpeed - fGravity;
    //the amount it goes up, minus the amount it goes down.
        xRend -= strafeSpeed;
        oldyRend = yRend;

    }

ジャンプを開始するには、jumpSpeedを任意の量だけ追加します。

問題は、1秒あたりの更新量が減少すると、ジャンプの持続時間とマグニチュードが減少することです。ここでのデルタ値は問題ないと確信しています。つまり、問題は方程式自体にあるはずです。

デルタが大きいほど、それはより速くfGravityオーバーランしていると思います。jumpSpeed

だから私の質問。問題が本当に方程式自体にある場合、プレーヤーの上向きの力から下向きの重力を引いたものをモデル化する正しい方法は何ですか?

jumpSpeed+=-0.0000005*elapsedTime*d;

double fGravity = 0.0000001*tesquared*d;

問題がデルタ値が正しく適用されていないことにある場合、それを適用する正しい方法は何でしょうか?

4

2 に答える 2

2

プレイヤーには「上向きの力」はありません(ジャンプしているまさにその時点を除いて)。力は運動量生成速度を与えます。空中に入ると、下向きの力(つまり重力)を感じて減速し、最終的には負の速度を生成して地面に戻します。

uプレーヤーが速度で上向きにジャンプし始めた場合、tそのジャンプの開始後、位置を計算するための古典的な方程式はですy = ut + 0.5 * at^2

この場合、は重力( 「上」aの場合は負)であり、yy = u * t - 0.5 * g * t ^ 2

于 2012-11-17T22:36:47.907 に答える
1

基本的に、ジャンプの方程式は次のようになります。

重力は垂直に適用され、下向きに一定の力を生成します。したがって、垂直速度はvy =vy0-経過時間*gであり、gは重力定数であり、vy0はジャンプ開始時の初速度です。

経過時間を計算する必要はありません。単純にすべてのフレームで、これを行います。

vy -= g * dt; // dt is the elapsed time since last frame

y += vy * dt;
x += vx * dt; // vx doesn't change in the jump
于 2012-11-17T22:39:30.663 に答える