2017-10-04 7 views
1

私は、プレイヤーが所定のトラックに沿って動く列車様のゲームを開発しようとしています。そして、私はトラックに沿ってプレーヤーを回して移動させる機能を作るのに苦労しています。このゲームでは、レベル全体でLとUのターン(90度と180度)のみを使用します。だから私の質問は、速度に関係なく(速度の異なるさまざまな種類の「列車」があります)、FPS(デバイスはどのように動作するか)に関係なく、プレーヤーが自分のトラック/軌道に沿って移動して移動するようにする方法ですFPSも変わる可能性があります)。これまで私が行ってきたことです:列車を回る動きを作る方法は?

/// <summary> 
/// Rotate and translate each tick if we are turning. 
/// This will be called each tick when we are at a junction and need to turn. 
/// </summary> 
/// <param name="dt"> The delta time in mili seconds. </param> 
/// <param name="turnRate"> The turn rate each second in degree. + if CW, - if CCW. </param> 
/// <param name="targetHeading"> The target angle in degree. Can be 0, 90, 180, 270. In world space coordinate. </param> 
/// <param name="speed"> The speed of the train. </param> 
void TurnAndMoveEachTick(float dt, float turnRate, float targetHeading, float speed) 
{ 
    float currentHeading = getHeading(); 
    float nextHeading = currentHeading + turnRate * dt; //Get thenext heading this tick 

    //Clamp the turning based on the targetHeading 
    if ((turnRate > 0.0 && nextHeading > targetHeading) || 
     (turnRate < 0.0 && nextHeading < targetHeading) ) 
     nextHeading = targetHeading; 

    //Turn 
    this.rotate(nextHeading, Coordinate::WORLD); //Rotate to nextHeading usng the world space coordinate. 

    //Move 
    float displacement = speed * dt; 
    this.translateBy(getHeading(), displacement); //Translate by displacement with the direction of the new heading. 
} 

私はこれを別の速度で試してみると、非常に間違っています。だから私はそれに応じてturnRateも調整しなければならない。しかし、どれだけ?それは私が得ないものです。また、FPSが落ちると、この機能もまた駄目になると思います(これは私のかなりハイエンドのワークステーションで試しました)。どうすればこの問題を解決できますか?

ありがとうございます。度

+0

正確に動作していないことがわかりにくいです。予期しない結果は何ですか? 2つの観察:a)turnRateは速度に依存するので、単に速度を引き渡して、この関数で旋回速度を計算させる方がよいでしょう。 b)dtは、この関数への次の呼び出しの現在の時間を保存することによって計算する必要があります。その後、時間差を測定することができます。 – Aziraphale

+0

移動した距離をパラメータとして使用して、見出しの計算を異なる方法で処理できます。あなたがターンに入るときは、各時間ステップで可変速度* dtを加えることによって、このターン内で移動した総距離を計算します。これにより、FPSとは独立した見出しが生成されます。 – Aziraphale

+0

a。うん、それは私が心に持っていたものです。しかし、私は速度に基づいてturnRateを計算する方法を知らない。たとえば、基本的に直径10メートルの半円であるUターントラックがあります。例えば60km/hの速度で電車の回転数を計算するにはどうすればよいですか?または100 km/h?それはFPSに基づいていろいろなdtを使用していません。 b。私は上手く理解できていない気がします。 dtが何であるかを言っているなら、私はデルタ時間が正確に何かをよく知っています。私が意味していたのは、ゲームが実行されるときのdtでした。たとえば、20 FPSは、40 FPSと異なります。どのようにそれを式に因数分解するのですか? –

答えて

1

turnRate速度/周囲で* DT * 360

円周20の固定FPSについて2 * PI *半径

は、あなたがDT = 0.05になるだろうです。あなたのターン100km/hと半径10mの例に注意してください。ターンに数ティックしか費やさないからです。あなたのコード例に基づいて、電車が軌道にそれ以上ないことは驚きではありません:)

コメントで提案したように、列車は所与の時点で移動している。ちょうどその時、距離にdtが

角度=距離/円周を現在の速度*を追加*ちょうどティックごとに発生したエラーを蓄積する360

turnRateをいじるする必要はありません。

これは役に立ちますか?

+0

私はあなたが何を意味したと思いますか?私はそれを試してみましょう。私はこれを答えと考えています。ありがとう。 –

関連する問題