2017-08-11 4 views
3

Jump'n'Runゲームでは、ジャンプをしようとしていますが、この機能が見つかりました。 問題は今、この関数は、フレームレートジャンプ機能 - フレームレートが異なる

public void jump() { 
    ySpeed = -100; 
} 

// time_diff is time difference between this and last frame 
public void update(double time_diff) { 
    y = y - ySpeed * time_diff; 
    ySpeed = ySpeed + 9.81 * time_diff; 
} 
に基づいて、私の性格ジャンプ異なる高さの原因となります例1のように、時にはそれが10

あるフレームレート(time_diffが)ので、時にはそれをシステム上で異なることです

また、フレームレート4と20の例もあります(値を20で割ったため、値が正確ではありません)が、フレームレートが20の場合、フレームレート4の場合と同様に高くジャンプします。

Jump Image

どのようにフレームレートに関係なくジャンプ高さが常に一定であることをアーカイブするにはどうすればよいですか?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

私はluk2302の助けwhithこのようにそれを解決:

double remaining_time = 0; 
final double step_size = 4; 

public void jump() { 
    ySpeed = -100; 
} 

// time_diff is time difference between this and last frame 
public void update(double time_diff) { 
    remaining_time += time_diff; 
    while (remaining_time >= step_size) { 
     update_helper(step_size); 
     remaining_time -= step_size; 
    } 
} 

public void update_helper(double time_diff) { 
    y = y - ySpeed * time_diff; 
    ySpeed = ySpeed + 9.81 * time_diff; 
} 
+0

'y'の新しい値を' y'の元の値に対して最大化しようとしましたか? –

+0

これはあなたの件名に関する良い話です:https://www.youtube.com/watch?v=hG9SzQxaCm8 – Andreas

答えて

4

キーポイント:フレームレートは決して物理計算に影響を与えてはなりません。

何をすべきかは、1/100秒などの物理ステップの固定ステップサイズを決めることです。その後、あなたは常にそのステップだけを実行します。あなたがオフセット段階に到達するまでの時間を蓄積し、蓄積している場合は、あまりにも多くの時間を複数のステップを実行します。

double remaining_time; 
final double step_size; 
public void update(double diff) { 
    remaining_time += diff; 
    while (remaining_time >= step_size) { 
     step(step_size); // perform your actual physics logic 
     remaining_time -= step_size; 
    } 
} 

あなたはstep_size計算の変更を変更するが、それはあなたのゲームは物理学の仕事を決めるどれだけある場合 - キーは、同じゲームを実行するすべてのクライアントで値が固定されていることです。

+0

ありがとう私はそれを試して、報告に戻ってくる:-) –

+0

いいね、もう一度、ちょうど私の更新私の解決策の質問... –

+1

@DennisEbnerがうれしいです。私が書いたロジックを1か所だけで行い、関連するすべての物理オブジェクトのステップ関数を上書きする必要があることに注意してください。非常に頻繁に 'ステップ'を実装し、 'update'を1回だけ書いてください。 – luk2302

関連する問題