2017-03-26 31 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定时器的问题是直接从this视频通过CodingMadeEasy撕开。问题是FPS计时器充当虽然它是不存在的,所以我怎么解决这个问题?

+0

下一页了解''处理的类型安全方式的时机需要。类型安全意味着粗心的错误,比如混乱的时间点与持续时间是在编译时捕获。视频教程:https://www.youtube.com/watch?v=P32hvk8b13M –

回答

1

阅读你的代码。你正在计算两行之间的时间:

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

这没有任何意义。你希望两个循环的迭代之间的时间,所以你必须在循环的界限这些行拆分:

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的逻辑,并重复这个答案指出的错误。 –