2017-03-26 16 views
-1

Visual Studio 2015でC++とsdl-2でゲームを作成していますが、現在はfpsタイマーを実装していますが、動作しません。基本的なFPSタイマーコード:問題のFPSタイマーが動作しない

#include <SDL.h> 
#include <Camera.h> 

int main() 
{ 

//create objects + camera 

float frameTime = 0.0f; 
int prevTime = 0; 
int currentTime = 0; 
float deltaTime = 0.0f; 

    while (isRunning) 
    { 

    SDL_Event ev; 

    keyState = SDL_GetKeyboardState(NULL); 

    prevTime = currentTime; 
    currentTime = SDL_GetTicks(); 
    deltaTime = (currentTime - prevTime)/1000.0f; 

    frameTime += deltaTime; 

     if (frameTime >= 0.25f) 
     { 

      if (keyState[SDL_SCANCODE_W] && !FreeRoam) 
      { 
       Object1.GetPos().z = (Object2.GetPos().z + 1); 
       camera.MoveForward(1); 
      } 
      //render 
     } 
    } 

return 0; 
} 

FPSタイマーがCodingMadeEasyによってthisビデオから直接リッピングされます。問題はfpsタイマーが存在しないかのように動作することです。この問題を解決するにはどうすればよいですか?

+0

次はあなたのタイミングは、タイプセーフな方法で必要と処理するために ''について学びます。タイプセーフティとは、コンパイル時に時間の浪費などの不注意なエラーが発生したことを意味します。ビデオチュートリアル:https://www.youtube.com/watch?v=P32hvk8b13M –

答えて

1

コードをお読みください。 2行の間の時間を数えます:

prevTime = currentTime; 
currentTime = SDL_GetTicks(); 
deltaTime = (currentTime - prevTime)/1000.0f; 

これは意味をなさないものです。あなたは、2回のループの反復間の時間をしたいので、あなたは、ループの境界内にこれらの行を分割する必要があります。

while (isRunning) 
{ 
    prevTime = currentTime; // Right here, in the loop's beguining 

    SDL_Event ev; 

    keyState = SDL_GetKeyboardState(NULL); 

    if (frameTime >= 0.25f) 
    { 

     if (keyState[SDL_SCANCODE_W] && !FreeRoam) 
     { 
      Object1.GetPos().z = (Object2.GetPos().z + 1); 
      camera.MoveForward(1); 
     } 
     //render 
    } 

    //End of the loop 

    currentTime = SDL_GetTicks(); 
    deltaTime = (currentTime - prevTime)/1000.0f; 

    frameTime += deltaTime; 
} 
+1

upvoted、問題を解決し、あなたの答えを説明してくれてありがとう! – DogWalkersCoding

1

フレーム更新後にframeTimeを0にリセットしないようです。

+0

今後の読者向け:これは正解です。現在受け入れられている回答は、OPのロジックを変更するものではなく、この回答が指摘するバグを繰り返します。 –

関連する問題