use new time system rather than the badly written old one

This commit is contained in:
2025-03-22 23:51:51 +01:00
parent 14c62914f0
commit f72949dc38
4 changed files with 40 additions and 47 deletions

View File

@@ -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(&gt.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;

View File

@@ -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
@@ -39,6 +39,6 @@ typedef struct {
} 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_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

View File

@@ -1,39 +1,24 @@
#pragma once
#include <time.h>
#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 <windows.h>
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

View File

@@ -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, &gt);
game_init(&gdat);
render_init(&rdat, &gdat);
}
@@ -43,7 +40,6 @@ static void update(void) {
}
// perform updates
gametime_update(&gt);
game_update(&gdat);
render_update(&rdat);
}