diff --git a/src/game/game.c b/src/game/game.c index 6541dbe..01c7760 100644 --- a/src/game/game.c +++ b/src/game/game.c @@ -43,10 +43,13 @@ void next_shape(gamedata* const dat) { dat->nxt[TETROMINO_COUNT - 1] = cache; } -void game_init(gamedata* const dat, gametime* gt) { +void game_init(gamedata* const dat) { // set a random seed using the system clock srand(time(NULL)); + struct gametime gt = {{0}, 0}; + gametime_get(>.ts); + // initialize audio device audiodevice* ad = audio_device_init(32000, AUDIO_S16, 1, 4096); @@ -83,15 +86,24 @@ void game_init(gamedata* const dat, gametime* gt) { shuffle(TETROMINO_COUNT, dat->nxt); // manually trigger a shuffle } +// updates the gametime +static inline void update_gametime(gamedata* dat) { + struct timespec ts; + gametime_get(&ts); + dat->time.ms = ts.tv_sec * 1000 + ts.tv_nsec / 1000000; + dat->time.ts = ts; +} + // called every time the game's state is updated void game_update(gamedata* const dat) { + update_gametime(dat); uint8_t const* keys = SDL_GetKeyboardState(NULL); if (keys[SDL_SCANCODE_ESCAPE]) dat->run = false; input_data move = MOVE_NONE; // contains the move data - uint32_t ctime = SDL_GetTicks(); + time_t ctime = dat->time.ms; if (ctime > dat->timer_update) { dat->timer_update = ctime + 500; diff --git a/src/game/game.h b/src/game/game.h index b0874d3..f6c0614 100644 --- a/src/game/game.h +++ b/src/game/game.h @@ -24,12 +24,12 @@ typedef colour8* row; typedef struct { row rows[ROWS]; - gametime* time; + struct gametime time; audiodevice* audio_device; audiodata music; - uint32_t timer_music; - uint32_t timer_update; - uint32_t timer_input; + time_t timer_music; + time_t timer_update; + time_t timer_input; uint16_t score; shape_id nxt[7]; // the order of the shape ids that they should appear in uint8_t curr_idx; // current shape index @@ -38,7 +38,7 @@ typedef struct { bool run; } gamedata; -void next_shape(gamedata*); // initializes everything needed to start the game; outputs to gamedata -void game_init(gamedata*, gametime*); // initializes the game -void game_update(gamedata*); // causes an update to occur within the game -void game_free(gamedata*); // frees the resources associated with the game +void next_shape(gamedata*); // initializes everything needed to start the game; outputs to gamedata +void game_init(gamedata*); // initializes the game +void game_update(gamedata*); // causes an update to occur within the game +void game_free(gamedata*); // frees the resources associated with the game diff --git a/src/game/gametime.h b/src/game/gametime.h index 4605256..bffb31a 100644 --- a/src/game/gametime.h +++ b/src/game/gametime.h @@ -1,39 +1,24 @@ #pragma once - #include -#include "../util/attributes.h" - -typedef struct { - struct timespec ts; // stores the time at the current update - double sec; // stores the current time in seconds - float scale; // multiplier for the time calculation, default value is 1.0 - float delta; // the time that it took between updates -} gametime; - -// initializes the gametime struct -atrb_const static inline gametime gametime_new(void) { +struct gametime { struct timespec ts; - timespec_get(&ts, TIME_UTC); + time_t ms; +}; - return (gametime){ - ts, - 0.0, - 1.0F, - 0.0F, - }; +#if _POSIX_C_SOURCE >= 199309L +static inline void gametime_get(struct timespec* ts) { + clock_gettime(CLOCK_MONOTONIC, ts); } - -// updates the internal variables -static inline void gametime_update(gametime* gt) { - struct timespec ts; - timespec_get(&ts, TIME_UTC); - gt->sec = (double)ts.tv_nsec * 1e-9; // calculate the current time in seconds - gt->delta = ((double)(ts.tv_nsec - gt->ts.tv_nsec) * 1e-9) * gt->scale; // calculate how much time has passed between this and last frame - gt->ts = ts; // update the game's timespec -} - -// gets how many times the game updates per second -atrb_const static inline float gametime_get_ups(gametime* gt) { - return 1.0F / gt->delta; +#elif defined _WIN32 +# include +static inline void gametime_get(struct timespec* ts) { + LARGE_INTEGER cnt, frq; + QueryPerformanceCounter(&cnt); + QueryPerformanceFrequency(&frq); + ts->tv_sec = (time_t)(cnt.QuadPart / frq.QuadPart); + ts->tv_nsec = (time_t)((cnt.QuadPart % frq.QuadPart) * 1000000000 / frq.QuadPart); } +#else +# error platform not supported +#endif diff --git a/src/main.c b/src/main.c index e0f204c..ee58857 100644 --- a/src/main.c +++ b/src/main.c @@ -6,11 +6,9 @@ #include "error.h" #include "game/game.h" -#include "game/gametime.h" #include "window/renderer.h" // initialized in init(), reading beforehand is undefined behaviour -static gametime gt; static gamedata gdat; static renderdata rdat; @@ -23,8 +21,7 @@ static void init(void) { fatal(ERROR_SDL_FONT_INIT, __FILE_NAME__, __LINE__, "the TTF module of SDL could not initialize! TTF Error: %s", TTF_GetError()); // initialize other game components - gt = gametime_new(); - game_init(&gdat, >); + game_init(&gdat); render_init(&rdat, &gdat); } @@ -43,7 +40,6 @@ static void update(void) { } // perform updates - gametime_update(>); game_update(&gdat); render_update(&rdat); }