From b63bbd3148e05efeaaac1a27eef9efc249f58d4d Mon Sep 17 00:00:00 2001 From: KikooDX Date: Tue, 27 Apr 2021 00:52:03 +0200 Subject: [PATCH] Automatic frameskip --- include/conf.h | 3 +-- src/main.c | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/include/conf.h b/include/conf.h index f23f5f2..1a6f08d 100644 --- a/include/conf.h +++ b/include/conf.h @@ -7,8 +7,7 @@ #define TILE_WIDTH 16 #define TILE_HEIGHT 16 #define TILESET_WIDTH 16 -#define TARGET_FPS 30 -#define TARGET_UPS 60 +#define TARGET_FPS 60 #define LVL_PER_PACK 4 #define ACC_GND 0.1 #define ACC_AIR 0.025 diff --git a/src/main.c b/src/main.c index 49f4693..fde0b39 100644 --- a/src/main.c +++ b/src/main.c @@ -43,13 +43,15 @@ extern char *fatal_error_msg; extern const font_t font_main; -static int callback(volatile void *arg); +static int callback(volatile int *arg); int main(void) { int i; int timer; int player_return_code; + int frameskip = 0; + int toskip = 0; /* int level_pack_beaten; */ enum TransitionMode transition_previous_mode; enum GameState game_state = TitleScreen; @@ -74,7 +76,7 @@ int main(void) PANIC(fatal_error_msg); /* timer setup */ timer = - timer_setup(TIMER_ANY, 1000000 / TARGET_UPS, callback, &has_ticked); + timer_setup(TIMER_ANY, 1000000 / TARGET_FPS, callback, &has_ticked); if (timer == -1) PANIC("timer_setup failed"); timer_start(timer); @@ -84,13 +86,19 @@ int main(void) /* main game loop */ while (!keydown(KEY_EXIT)) { - /* do x updates per frame, x being ups/fps */ - i = TARGET_UPS / TARGET_FPS; + /* skip render frames */ + i = 1 + frameskip; + toskip = frameskip; while (i-- > 0) { + /* frameskip adjustement */ + if (has_ticked - 1 > frameskip) + frameskip = has_ticked - 1; + /* speed limiter */ while (!has_ticked) sleep(); - has_ticked = 0; + while (has_ticked) + has_ticked = 0; /* update */ input_update(&input); @@ -204,6 +212,7 @@ int main(void) case Playing: level_draw(); particles_draw(); + trail_draw(); player_draw(player); transition_draw(transition); break; @@ -222,9 +231,8 @@ int main(void) return 1; } -static int callback(volatile void *arg) +static int callback(volatile int *arg) { - volatile int *has_ticked = arg; - *has_ticked = 1; + *arg += 1; return 0; }