From c6b71f1686e3e37887620b59a3ce9dd7c31294f5 Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Sat, 3 Feb 2018 03:37:44 +0100 Subject: [PATCH] Add delta parameter to Gamestate_Logic calls --- src/gamestate.h | 2 +- src/internal.c | 4 ++-- src/internal.h | 2 +- src/libsuperderpy.c | 9 ++++++--- src/libsuperderpy.h | 4 +++- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/gamestate.h b/src/gamestate.h index d4660ec..e1e2788 100644 --- a/src/gamestate.h +++ b/src/gamestate.h @@ -25,7 +25,7 @@ struct Gamestate_API { void (*Gamestate_Draw)(struct Game* game, void* data); - void (*Gamestate_Logic)(struct Game* game, void* data); + void (*Gamestate_Logic)(struct Game* game, void* data, double delta); void* (*Gamestate_Load)(struct Game* game, void (*progress)(struct Game* game)); void (*Gamestate_Start)(struct Game* game, void* data); diff --git a/src/internal.c b/src/internal.c index 337bab3..e6cd5de 100644 --- a/src/internal.c +++ b/src/internal.c @@ -37,12 +37,12 @@ SYMBOL_INTERNAL void DrawGamestates(struct Game* game) { } } -SYMBOL_INTERNAL void LogicGamestates(struct Game* game) { +SYMBOL_INTERNAL void LogicGamestates(struct Game* game, double delta) { struct Gamestate* tmp = game->_priv.gamestates; while (tmp) { if ((tmp->loaded) && (tmp->started) && (!tmp->paused)) { game->_priv.current_gamestate = tmp; - (*tmp->api->Gamestate_Logic)(game, tmp->data); + (*tmp->api->Gamestate_Logic)(game, tmp->data, delta); } tmp = tmp->next; } diff --git a/src/internal.h b/src/internal.h index 7b58b03..5e2a1a0 100644 --- a/src/internal.h +++ b/src/internal.h @@ -63,7 +63,7 @@ struct ScreenshotThreadData { }; void DrawGamestates(struct Game* game); -void LogicGamestates(struct Game* game); +void LogicGamestates(struct Game* game, double delta); void EventGamestates(struct Game* game, ALLEGRO_EVENT* ev); void ReloadGamestates(struct Game* game); void FreezeGamestates(struct Game* game); diff --git a/src/libsuperderpy.c b/src/libsuperderpy.c index 1ae5757..bb5f016 100644 --- a/src/libsuperderpy.c +++ b/src/libsuperderpy.c @@ -277,8 +277,8 @@ SYMBOL_EXPORT int libsuperderpy_run(struct Game* game) { game->_priv.loading.gamestate->data = (*game->_priv.loading.gamestate->api->Gamestate_Load)(game, NULL); PrintConsole(game, "Loading screen registered."); + game->_priv.timestamp = al_get_time(); game->_priv.draw = true; - #ifdef __EMSCRIPTEN__ void libsuperderpy_mainloop(void* game); emscripten_set_main_loop_arg(libsuperderpy_mainloop, game, 0, true); @@ -389,6 +389,7 @@ SYMBOL_INTERNAL void libsuperderpy_mainloop(void* g) { (*game->_priv.loading.gamestate->api->Gamestate_Stop)(game, game->_priv.loading.gamestate->data); } al_resume_timer(game->_priv.timer); + game->_priv.timestamp = al_get_time(); } tmp = tmp->next; @@ -445,7 +446,9 @@ SYMBOL_INTERNAL void libsuperderpy_mainloop(void* g) { } if ((ev.type == ALLEGRO_EVENT_TIMER) && (ev.timer.source == game->_priv.timer)) { - LogicGamestates(game); + double delta = al_get_time() - game->_priv.timestamp; + game->_priv.timestamp += delta; + LogicGamestates(game, delta); redraw = true; } else if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { #ifdef __EMSCRIPTEN__ @@ -483,7 +486,7 @@ SYMBOL_INTERNAL void libsuperderpy_mainloop(void* g) { } else if ((ev.type == ALLEGRO_EVENT_KEY_DOWN) && (game->config.debug) && (ev.keyboard.keycode == ALLEGRO_KEY_F1)) { int i; for (i = 0; i < 512; i++) { - LogicGamestates(game); + LogicGamestates(game, ALLEGRO_BPS_TO_SECS(al_get_timer_speed(game->_priv.timer))); } game->_priv.showconsole = true; PrintConsole(game, "DEBUG: 512 frames skipped..."); diff --git a/src/libsuperderpy.h b/src/libsuperderpy.h index a5ae3e3..f8d303d 100644 --- a/src/libsuperderpy.h +++ b/src/libsuperderpy.h @@ -120,6 +120,8 @@ struct Game { bool draw; + double timestamp; + #ifdef ALLEGRO_MACOSX char cwd[MAXPATHLEN]; #endif @@ -153,7 +155,7 @@ void libsuperderpy_destroy(struct Game* game); struct GamestateResources; extern int Gamestate_ProgressCount; void Gamestate_ProcessEvent(struct Game* game, struct GamestateResources* data, ALLEGRO_EVENT* ev); -void Gamestate_Logic(struct Game* game, struct GamestateResources* data); +void Gamestate_Logic(struct Game* game, struct GamestateResources* data, double delta); void Gamestate_Draw(struct Game* game, struct GamestateResources* data); void* Gamestate_Load(struct Game* game, void (*progress)(struct Game*)); void Gamestate_Unload(struct Game* game, struct GamestateResources* data);