2013-06-23 5 views
5

デルタタイムを使用しているので、プログラムのフレームレートを独立させることができます。 しかし、私はジャンプの高さを同じにすることはできません、文字は常に低いフレームレートで高いジャンプします。デルタ時間を使用するとジャンプ高さを同じに保つにはどうすればよいですか?

変数:

const float gravity = 0.0000000014f; 
const float jumpVel = 0.00000046f; 
const float terminalVel = 0.05f; 
bool readyToJump = false; 
float verticalVel = 0.00f; 

ロジックコード:

if(input.isKeyDown(sf::Keyboard::Space)){ 
    if(readyToJump){ 
     verticalVel = -jumpVel * delta; 
     readyToJump = false; 
    } 
} 

verticalVel += gravity * delta; 
y += verticalVel * delta; 

私は文字が水平に微移動するので、デルタ時間が正しいことを確信しています。

フレームレートに関係なくキャラクターを同じようにジャンプさせるにはどうすればよいですか?

+0

「デルタ」とは何ですか? –

答えて

6

新たな位置を計算するための式は:

position = initial_position + velocity * time 

関数に従って速度を低下させるアカウント重力を考慮:

velocity = initial_velocity + (gravity^2 * time) 

注:この場合、重力が同じではありません重力として 最終式は、次のようになります。

position = initial_position + (initial_velocity + (gravity^2 * time) * time 

あなたは上記の式からわかるように、initial_positionとinitial_velocityは時間の影響を受けません。しかし、実際には、最初の速度を-jumpVelocity * deltaに設定します。

フレームレートが低いほど、deltaの値が大きくなるため、文字が高くジャンプします。解決策は

if(readyToJump){ 
    verticalVel = -jumpVel; 
    readyToJump = false; 
} 

EDITに

if(readyToJump){ 
    verticalVel = -jumpVel * delta; 
    readyToJump = false; 
} 

を変更することです:

は、上記のかなり良い評価を与えるべきであるが、それは完全に間違っています。 tの後の位置(この場合は高さ)をp(t)とすると、v(t) = p'(t)', and the acceleration is given byで与えられる速度は、a(t)= v '(t)= p "(t)`で与えられる。加速が一定であることがわかっているので、すなわち、重力、我々は次を得る:

a(t) = g 
v(t) = v0 + g*t 
p(t) = p0 + v0*t + 1/2*g*t^2 

我々は今、別の時間内の1つのインスタンスからの位置の変化、すなわち、私たちは次のことを得る、p(t+delta)-p(t)を計算する場合:

p(t+delta)-p(t) = p0 + v0*(t+delta) + 1/2*g*(t+delta)^2 - (p0 + v0*t + 1/2*g*t^2) 
       = v0*delta + 1/2*g*delta^2 + g*delta*t 

元のコードにはありませんdeltaの二乗または追加の語g*delta*t*を考慮に入れてください。より正確なアプローチは、デルタの増加を格納し、上記の式p(t)を使用することです。

サンプルコード:

const float gravity = 0.0000000014f; 
const float jumpVel = 0.00000046f; 
const float limit = ...; // limit for when to stop jumping 

bool isJumping = false; 
float jumpTime; 

if(input.isKeyDown(sf::Keyboard::Space)){ 
    if(!isJumping){ 
     jumpTime = 0; 
     isJumping = true; 
    } 
    else { 
     jumpTime += delta; 
     y = -jumpVel*jumpTime + gravity*sqr(jumpTime); 
     // stop jump 
     if(y<=0.0f) { 
      y = 0.0f; 
      isJumping = false; 
     } 
    } 
} 

注:私は上記のコードをコンパイルしたりテストしていません。

+0

ありがとう!私はverticalVelがどこに影響を与えたのか分からなかったので、サンプルコードは本当にうまくいきませんでした。しかし、あなたの答えは私の問題に対する解決策を見つけるのに役立ちました。 – user2513924

+0

申し訳ありませんが、その行を逃しました。それは効果がなかった。私の更新でそれを削除しました。 – TAS

0

「デルタタイム」とは、可変時間ステップを意味しますか?のように、すべてのフレームで、前の時間とは全く異なる時間ステップを計算しますか?

もしそうなら、ではありません。

本を読むhttp://gafferongames.com/game-physics/fix-your-timestep/

TL; DR:内部状態のために一定時間ステップを使用します。必要に応じてフレームを補間する。

関連する問題