新たな位置を計算するための式は:
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;
}
}
}
注:私は上記のコードをコンパイルしたりテストしていません。
出典
2013-06-23 18:14:22
TAS
「デルタ」とは何ですか? –