diff --git a/code/classes.h b/code/classes.h index d291d87..cf4ddf7 100644 --- a/code/classes.h +++ b/code/classes.h @@ -185,6 +185,8 @@ class Math { class Graphics { + unsigned long frameLimit; + int thirds; public: @@ -446,8 +448,28 @@ class Graphics { void updateScreen() { SDL_Flip(screen); - // Give the audio (and possibly the X server) time to work... - SDL_Delay(1); + } + + /* + * Delay until the next 60 Hz frame + */ + void delayFrame() + { + unsigned long now = SDL_GetTicks(); + + // Add 16 2/3 to frameLimit + frameLimit += 16; + if(thirds >= 2) { + thirds = 0; + } else { + thirds++; + frameLimit++; + } + + if(now < frameLimit) + SDL_Delay(frameLimit - now); + else + frameLimit = now; } /* diff --git a/code/game.cpp b/code/game.cpp index eea4718..2b2512e 100644 --- a/code/game.cpp +++ b/code/game.cpp @@ -108,7 +108,6 @@ int mainGameLoop() engine.musicVolume = 100; int rtn = 0; - unsigned long frameLimit = SDL_GetTicks(); int allowableAliens = 999999999; @@ -276,13 +275,7 @@ int mainGameLoop() break; } - // (Attempt to) Limit us to 60 frame a second - while (SDL_GetTicks() < (frameLimit + 16)) - { - // Do nothing. If we were to insert an SDL_Delay(1) in here - // then we would actually lose around 10 frames per second!! - } - frameLimit = SDL_GetTicks(); + graphics.delayFrame(); } graphics.flushBuffer(); diff --git a/code/intermission.cpp b/code/intermission.cpp index d7b6663..0d55092 100644 --- a/code/intermission.cpp +++ b/code/intermission.cpp @@ -596,8 +596,6 @@ int galaxyMap() else player.shield = player.maxShield; - unsigned long frameLimit = SDL_GetTicks(); - flushInput(); engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = engine.keyState[SDLK_SPACE] = 0; engine.done = 0; @@ -832,9 +830,7 @@ int galaxyMap() engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = engine.keyState[SDLK_SPACE] = 0; doCursor(); - // Limit us to 60 frame a second - while (SDL_GetTicks() < (frameLimit + 16)){} - frameLimit = SDL_GetTicks(); + graphics.delayFrame(); } Mix_HaltMusic(); diff --git a/code/script.cpp b/code/script.cpp index e25c61e..4b114be 100644 --- a/code/script.cpp +++ b/code/script.cpp @@ -237,7 +237,6 @@ void doCutscene(int scene) enemy[i].engineY = (enemy[i].image[0]->h / 2); } - unsigned long frameLimit = SDL_GetTicks(); signed char showMessage = 0; signed char currentMessage = -1; int timer = 60 * 4; @@ -298,9 +297,8 @@ void doCutscene(int scene) if ((showMessage) && (graphics.messageBox != NULL)) graphics.blit(graphics.messageBox, (800 - graphics.messageBox->w) / 2, 500); - while (SDL_GetTicks() < (frameLimit + 16)){} - frameLimit = SDL_GetTicks(); - + graphics.delayFrame(); + if (engine.keyState[SDLK_ESCAPE]) break; } diff --git a/code/title.cpp b/code/title.cpp index 9a22b5d..5dd8da9 100644 --- a/code/title.cpp +++ b/code/title.cpp @@ -234,7 +234,6 @@ int doTitle() signed char menuType = 0; graphics.drawBackGround(); - unsigned long frameLimit = SDL_GetTicks(); engine.done = 0; flushInput(); @@ -453,8 +452,7 @@ int doTitle() engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = engine.keyState[SDLK_SPACE] = 0; } - while (SDL_GetTicks() < (frameLimit + 16)){} - frameLimit = SDL_GetTicks(); + graphics.delayFrame(); } Mix_HaltMusic(); @@ -529,8 +527,6 @@ void showStory() graphics.blit(graphics.background, 0, 0); graphics.flushBuffer(); - unsigned long frameLimit = SDL_GetTicks(); - flushInput(); engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = engine.keyState[SDLK_SPACE] = 0; @@ -558,8 +554,7 @@ void showStory() break; } - while (SDL_GetTicks() < (frameLimit + 16)){} - frameLimit = SDL_GetTicks(); + graphics.delayFrame(); } } @@ -593,7 +588,6 @@ void gameover() int x = (800 - gameover->w) / 2; int y = (600 - gameover->h) / 2; - unsigned long frameLimit = SDL_GetTicks(); graphics.updateScreen(); flushInput(); @@ -613,9 +607,7 @@ void gameover() y = ((600 - gameover->h) / 2) - Math::rrand(-2, 2); graphics.blit(gameover, x, y); - // Limit us to 60 frame a second - while (SDL_GetTicks() < (frameLimit + 16)){} - frameLimit = SDL_GetTicks(); + graphics.delayFrame(); } SDL_FreeSurface(gameover); @@ -693,7 +685,6 @@ void doCredits() SDL_Delay(10000); graphics.drawBackGround(); - unsigned long frameLimit = SDL_GetTicks(); engine.done = 0; lastCredit = numberOfCredits - 1; @@ -724,8 +715,7 @@ void doCredits() SDL_FillRect(graphics.screen, &r1, graphics.black); SDL_FillRect(graphics.screen, &r2, graphics.black); - while (SDL_GetTicks() < (frameLimit + 16)){} - frameLimit = SDL_GetTicks(); + graphics.delayFrame(); } for (int i = 0 ; i < numberOfCredits ; i++)