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++)