diff --git a/src/Starfighter.cpp b/src/Starfighter.cpp index 8a3fde0..f28775c 100644 --- a/src/Starfighter.cpp +++ b/src/Starfighter.cpp @@ -86,12 +86,12 @@ int main(int argc, char **argv) if (cheatAttempt && !engine.cheat) { - clearScreen(black); + screen_clear(black); screen_renderString("That doesn't work anymore", -1, 285, FONT_WHITE); screen_renderString("Try harder...", -1, 315, FONT_WHITE); renderer_update(); SDL_Delay(2000); - clearScreen(black); + screen_clear(black); renderer_update(); SDL_Delay(500); } diff --git a/src/game.cpp b/src/game.cpp index 80f73eb..b9fa2e2 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -22,6 +22,8 @@ along with this program. If not, see . Game game; static Star stars[STARS_NUM]; +static Uint32 frameLimit = 0; +static int thirds = 0; void game_init() { @@ -205,7 +207,7 @@ void game_doStars() WRAP_ADD(stars[i].y, (engine.ssy + engine.smy) * stars[i].speed, 0, screen->h - 1); - putpixel(screen, (int)stars[i].x, (int)stars[i].y, color); + gfx_putPixel(screen, (int)stars[i].x, (int)stars[i].y, color); r.x = (int)stars[i].x; r.y = (int)stars[i].y; r.w = 1; @@ -1906,6 +1908,28 @@ static void game_doHud() } } +/* + * Delay until the next 60 Hz frame + */ +void game_delayFrame() +{ + Uint32 now = SDL_GetTicks(); + + // Add 16 2/3 (= 1000 / 60) to frameLimit + frameLimit += 16; + thirds += 2; + while (thirds >= 3) + { + thirds -= 3; + frameLimit++; + } + + if(now < frameLimit) + SDL_Delay(frameLimit - now); + else + frameLimit = now; +} + /* Checked during the main game loop. When the game is paused it goes into a constant loop checking this routine. If escape is @@ -2234,7 +2258,7 @@ int game_mainLoop() while (engine.paused) { engine.done = game_checkPauseRequest(); - delayFrame(); + game_delayFrame(); } audio_resumeMusic(); @@ -2271,7 +2295,7 @@ int game_mainLoop() (aliens[ALIEN_BOSS].flags & FL_ESCAPED)) { audio_playSound(SFX_DEATH, aliens[ALIEN_BOSS].x); - clearScreen(white); + screen_clear(white); renderer_update(); for (int i = 0 ; i < 300 ; i++) { @@ -2283,7 +2307,7 @@ int game_mainLoop() break; } - delayFrame(); + game_delayFrame(); } screen_flushBuffer(); diff --git a/src/game.h b/src/game.h index 5518dc6..829ea64 100644 --- a/src/game.h +++ b/src/game.h @@ -25,6 +25,7 @@ extern Game game; void game_init(); void game_doStars(); void game_doExplosions(); +void game_delayFrame(); bool game_collision(float x0, float y0, int w0, int h0, float x2, float y2, int w1, int h1); int game_mainLoop(); diff --git a/src/gfx.cpp b/src/gfx.cpp index 5967f71..54d4901 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -21,9 +21,6 @@ along with this program. If not, see . #include "Starfighter.h" -static unsigned long frameLimit; -static int thirds; - SDL_Surface *gfx_background; SDL_Surface *shape[MAX_SHAPES]; SDL_Surface *shipShape[MAX_SHIPSHAPES]; @@ -58,8 +55,6 @@ void gfx_init() gfx_background = NULL; messageBox = NULL; - frameLimit = 0; - thirds = 0; screen = NULL; } @@ -186,41 +181,11 @@ int gfx_renderString(const char *in, int x, int y, int fontColor, int wrap, SDL_ return gfx_renderStringBase(in, x, y, fontColor, wrap, dest); } -void clearScreen(Uint32 color) -{ - SDL_FillRect(screen, NULL, color); -} - -/* - * 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; -} - /* * Set the pixel at (x, y) to the given value * NOTE: The surface must be locked before calling this! */ -void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel) +void gfx_putPixel(SDL_Surface *surface, int x, int y, Uint32 pixel) { int bpp = surface->format->BytesPerPixel; /* Here p is the address to the pixel we want to set */ @@ -272,7 +237,7 @@ void drawLine(SDL_Surface *dest, int x1, int y1, int x2, int y2, int col) while(1) { - putpixel(dest, x1, y1, col); + gfx_putPixel(dest, x1, y1, col); if (x1 > x2) x1--; if (x1 < x2) x1++; @@ -307,10 +272,10 @@ void circle(int xc, int yc, int R, SDL_Surface *PIX, int col) int y = R, yy = 2 * R; int p = 1 - R; - putpixel(PIX, xc, yc - y, col); - putpixel(PIX, xc, yc + y, col); - putpixel(PIX, xc - y, yc, col); - putpixel(PIX, xc + y, yc, col); + gfx_putPixel(PIX, xc, yc - y, col); + gfx_putPixel(PIX, xc, yc + y, col); + gfx_putPixel(PIX, xc - y, yc, col); + gfx_putPixel(PIX, xc + y, yc, col); while (x < y) { @@ -324,22 +289,22 @@ void circle(int xc, int yc, int R, SDL_Surface *PIX, int col) } p += xx + 1; - putpixel(PIX, xc - x, yc - y, col); - putpixel(PIX, xc + x, yc - y, col); - putpixel(PIX, xc - x, yc + y, col); - putpixel(PIX, xc + x, yc + y, col); - putpixel(PIX, xc - y, yc - x, col); - putpixel(PIX, xc + y, yc - x, col); - putpixel(PIX, xc - y, yc + x, col); - putpixel(PIX, xc + y, yc + x, col); + gfx_putPixel(PIX, xc - x, yc - y, col); + gfx_putPixel(PIX, xc + x, yc - y, col); + gfx_putPixel(PIX, xc - x, yc + y, col); + gfx_putPixel(PIX, xc + x, yc + y, col); + gfx_putPixel(PIX, xc - y, yc - x, col); + gfx_putPixel(PIX, xc + y, yc - x, col); + gfx_putPixel(PIX, xc - y, yc + x, col); + gfx_putPixel(PIX, xc + y, yc + x, col); } if ((x = y)) { - putpixel(PIX, xc - x, yc - y, col); - putpixel(PIX, xc + x, yc - y, col); - putpixel(PIX, xc - x, yc + y, col); - putpixel(PIX, xc + x, yc + y, col); + gfx_putPixel(PIX, xc - x, yc - y, col); + gfx_putPixel(PIX, xc + x, yc - y, col); + gfx_putPixel(PIX, xc - x, yc + y, col); + gfx_putPixel(PIX, xc + x, yc + y, col); } } diff --git a/src/gfx.h b/src/gfx.h index b064960..34f4310 100644 --- a/src/gfx.h +++ b/src/gfx.h @@ -35,9 +35,7 @@ void gfx_init(); SDL_Surface *gfx_setTransparent(SDL_Surface *sprite); void gfx_blit(SDL_Surface *image, int x, int y, SDL_Surface *dest); int gfx_renderString(const char *in, int x, int y, int fontColor, int wrap, SDL_Surface *dest); -extern void clearScreen(Uint32 color); -extern void delayFrame(); -extern void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel); +void gfx_putPixel(SDL_Surface *surface, int x, int y, Uint32 pixel); extern void drawLine(SDL_Surface *dest, int x1, int y1, int x2, int y2, int col); extern void drawLine(int x1, int y1, int x2, int y2, int col); extern void circle(int xc, int yc, int R, SDL_Surface *PIX, int col); diff --git a/src/init.cpp b/src/init.cpp index 97e4a11..f45c9da 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -45,7 +45,7 @@ be seen by people unless something really stoopid happens! */ void showErrorAndExit(int errorId, const char *name) { - clearScreen(black); + screen_clear(black); if (errorId != 2) { @@ -89,7 +89,7 @@ void showErrorAndExit(int errorId, const char *name) while (!engine.keyState[KEY_ALTFIRE]) { getPlayerInput(); - delayFrame(); + game_delayFrame(); } exit(1); diff --git a/src/intermission.cpp b/src/intermission.cpp index 732bd3a..8ef460e 100644 --- a/src/intermission.cpp +++ b/src/intermission.cpp @@ -575,9 +575,9 @@ int intermission() // do not perform certain keyboard actions engine.gameSection = SECTION_INTERMISSION; - clearScreen(black); + screen_clear(black); renderer_update(); - clearScreen(black); + screen_clear(black); initSaveSlots(); @@ -948,7 +948,7 @@ int intermission() engine.keyState[KEY_ALTFIRE] = 0; intermission_doCursor(); - delayFrame(); + game_delayFrame(); } audio_haltMusic(); diff --git a/src/missions.cpp b/src/missions.cpp index c530ee3..7f85da0 100644 --- a/src/missions.cpp +++ b/src/missions.cpp @@ -753,12 +753,12 @@ mission begins playing here. */ void missionBriefScreen() { - clearScreen(black); + screen_clear(black); renderer_update(); if (game.area != MISN_INTERCEPTION) { - clearScreen(black); + screen_clear(black); drawBriefScreen(); if (currentMission.timeLimit1[0] > 0) @@ -828,16 +828,16 @@ void missionBriefScreen() while (true) { - delayFrame(); + game_delayFrame(); getPlayerInput(); if ((engine.keyState[KEY_FIRE]) || (engine.keyState[KEY_ALTFIRE]) || (engine.keyState[KEY_ESCAPE])) break; } - clearScreen(black); + screen_clear(black); renderer_update(); - clearScreen(black); + screen_clear(black); } engine.gameSection = SECTION_GAME; @@ -856,13 +856,13 @@ void missionFinishedScreen() if (game.area != MISN_INTERCEPTION) { - clearScreen(black); + screen_clear(black); renderer_update(); if (game.shots > 0) game.accuracy = (game.hits * 100) / game.shots; - clearScreen(black); + screen_clear(black); drawBriefScreen(); for (int i = 0 ; i < 3 ; i++) @@ -931,7 +931,7 @@ void missionFinishedScreen() while (true) { - delayFrame(); + game_delayFrame(); getPlayerInput(); if ((engine.keyState[KEY_FIRE])) break; diff --git a/src/screen.cpp b/src/screen.cpp index 15e9b65..f289e6a 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -112,3 +112,8 @@ void screen_unBuffer() screen_bufferHead->next = NULL; } + +void screen_clear(Uint32 color) +{ + SDL_FillRect(screen, NULL, color); +} diff --git a/src/screen.h b/src/screen.h index c0c185f..14ed43c 100644 --- a/src/screen.h +++ b/src/screen.h @@ -33,5 +33,6 @@ void screen_drawBackground(); void screen_addBuffer(int x, int y, int w, int h); void screen_flushBuffer(); void screen_unBuffer(); +void screen_clear(Uint32 color); #endif diff --git a/src/script.cpp b/src/script.cpp index 78e01bc..0e42269 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -186,9 +186,9 @@ static void setScene(int scene) void doCutscene(int scene) { - clearScreen(black); + screen_clear(black); renderer_update(); - clearScreen(black); + screen_clear(black); engine.keyState[KEY_FIRE] = 0; engine.keyState[KEY_ALTFIRE] = 0; @@ -303,7 +303,7 @@ void doCutscene(int scene) screen_renderString("Press [Escape] to skip", -1, 580, FONT_WHITE); - delayFrame(); + game_delayFrame(); if ((engine.keyState[KEY_ESCAPE]) || (engine.keyState[KEY_FIRE]) || (engine.keyState[KEY_ALTFIRE])) @@ -312,6 +312,6 @@ void doCutscene(int scene) screen_flushBuffer(); freeGraphics(); - clearScreen(black); + screen_clear(black); renderer_update(); } diff --git a/src/title.cpp b/src/title.cpp index bcce46d..faef7a2 100644 --- a/src/title.cpp +++ b/src/title.cpp @@ -190,9 +190,9 @@ int doTitle() loadGameGraphics(); - clearScreen(black); + screen_clear(black); renderer_update(); - clearScreen(black); + screen_clear(black); signed char continueSaveSlot = initSaveSlots(); @@ -530,7 +530,7 @@ int doTitle() engine.keyState[KEY_FIRE] = engine.keyState[KEY_ALTFIRE] = 0; } - delayFrame(); + game_delayFrame(); } audio_haltMusic(); @@ -622,7 +622,7 @@ void showStory() break; } - delayFrame(); + game_delayFrame(); } } @@ -640,9 +640,9 @@ void gameover() SDL_Surface *gameover = loadImage("gfx/gameover.png"); - clearScreen(black); + screen_clear(black); renderer_update(); - clearScreen(black); + screen_clear(black); SDL_Delay(1000); audio_playMusic("music/death.ogg", -1); @@ -669,7 +669,7 @@ void gameover() y = ((screen->h - gameover->h) / 2) - RANDRANGE(-2, 2); screen_blit(gameover, x, y); - delayFrame(); + game_delayFrame(); } SDL_FreeSurface(gameover); @@ -693,9 +693,9 @@ void doCredits() textObject *credit; - clearScreen(black); + screen_clear(black); renderer_update(); - clearScreen(black); + screen_clear(black); screen_drawBackground(); @@ -751,7 +751,7 @@ void doCredits() credit[i].y -= speed; } - delayFrame(); + game_delayFrame(); } for (i = 0 ; i <= lastCredit ; i++)