More cleanup. Also rewrote the method of frame delaying a bit.
I rewrote the method because what it was doing was so confusing, I couldn't figure out whether it actually worked right or not. I think it did, and it's only 2/3 of a milllisecond anyway (not noticeable at all), but this new way of writing it is much clearer.
This commit is contained in:
parent
7694d668ff
commit
17b5f60958
|
@ -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);
|
||||
}
|
||||
|
|
32
src/game.cpp
32
src/game.cpp
|
@ -22,6 +22,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
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();
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
71
src/gfx.cpp
71
src/gfx.cpp
|
@ -21,9 +21,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
||||
#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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -112,3 +112,8 @@ void screen_unBuffer()
|
|||
|
||||
screen_bufferHead->next = NULL;
|
||||
}
|
||||
|
||||
void screen_clear(Uint32 color)
|
||||
{
|
||||
SDL_FillRect(screen, NULL, color);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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++)
|
||||
|
|
Loading…
Reference in New Issue