diff --git a/inc/conf.h b/inc/conf.h index 6082fc3..fc78307 100644 --- a/inc/conf.h +++ b/inc/conf.h @@ -1,5 +1,6 @@ #pragma once +#define TARGET_FPS 60 #define TILE_SIZE 16 #define PLAYER_WIDTH 12 #define PLAYER_HEIGHT 12 diff --git a/src/main.c b/src/main.c index 30d69b8..ed9d835 100644 --- a/src/main.c +++ b/src/main.c @@ -1,27 +1,41 @@ +#include "conf.h" #include "input.h" #include "level.h" #include "player.h" +#include #include +#include static struct Player player; +static int timer; +static volatile int has_ticked; static void init(void); static void deinit(void); static void draw(void); static void update(void); +static int timer_callback(volatile int *); int main(void) { extern const struct LevelBin kble_test; + int frameskip = 1; init(); level_load(&kble_test); - draw(); do { - update(); + int i; draw(); + for (i = 0; i < frameskip; i++) { + if (has_ticked > frameskip) frameskip = has_ticked; + while (!has_ticked) + sleep(); + while (has_ticked) + has_ticked = 0; + update(); + } } while (input_up(K_EXIT)); deinit(); @@ -31,6 +45,10 @@ main(void) static void init(void) { + timer = timer_configure(TIMER_ANY, 1000000 / TARGET_FPS, + GINT_CALL(timer_callback, &has_ticked)); + timer_start(timer); + input_init(); level_init(); player_init(&player); @@ -40,6 +58,8 @@ static void deinit(void) { level_deinit(); + + timer_stop(timer); } static void @@ -57,3 +77,10 @@ draw(void) player_draw(&player); dupdate(); } + +static int +timer_callback(volatile int *arg) +{ + *arg += 1; + return 0; +}