From 134ef0588abe5c6cac6d9622e8daddf37f22c6e9 Mon Sep 17 00:00:00 2001 From: KikooDX Date: Sat, 19 Sep 2020 14:00:46 +0200 Subject: [PATCH] Independent UPS, FPS, precision, unit and drawing system. --- include/conf.h | 7 +++++-- include/input.h | 5 +++-- include/main.h | 6 +++--- include/player.h | 2 +- include/vec.h | 2 -- src/camera.c | 11 +++++++++-- src/main.c | 32 +++++++++++++++++--------------- src/player.c | 22 ++++++++-------------- 8 files changed, 46 insertions(+), 41 deletions(-) diff --git a/include/conf.h b/include/conf.h index e9adb9e..33567d7 100644 --- a/include/conf.h +++ b/include/conf.h @@ -1,9 +1,12 @@ -#define UPS 32 -#define FPS 32 +#define VEC_PRECISION 1024 +#define UPS 256 +#define PXS (VEC_PRECISION / UPS) #ifdef FX9860G #define SCALE 1 +#define FPS 64 #endif /* FX9860G */ #ifdef FXCG50 #define SCALE 2 +#define FPS 32 #endif /* FXCG50 */ diff --git a/include/input.h b/include/input.h index 5d38dc5..d69e89f 100644 --- a/include/input.h +++ b/include/input.h @@ -3,13 +3,14 @@ #include -#define KEYS_COUNT 4 +#define KEYS_COUNT 5 enum { K_LEFT, K_RIGHT, K_UP, - K_DOWN + K_DOWN, + K_EXIT }; enum { diff --git a/include/main.h b/include/main.h index 26d3656..ad924d5 100644 --- a/include/main.h +++ b/include/main.h @@ -4,7 +4,7 @@ #include "input.h" int play_level(int level_id); -/* callback used for FPS control */ +/* callback used for UPS control */ int callback(volatile void *arg); -void step_event(Player *player, Level *level, Camera *camera, Input *input); -void draw_event(Player *player, Level *level, Camera *camera, Input *input); +void step_event(Player *player, Level *level, Camera *camera, Input *input, uint step); +void draw_event(Player *player, Level *level, Camera *camera, Input *input, uint step); diff --git a/include/player.h b/include/player.h index c47aec7..a8a2729 100644 --- a/include/player.h +++ b/include/player.h @@ -14,6 +14,6 @@ typedef struct Player void player_step(Player *player, Input *input); void player_draw(Player *player, Camera *camera); -void player_draw_debug(Player *player); +void player_draw_debug(Player *player, uint step); #endif /* _DEF_PLAYER */ diff --git a/include/vec.h b/include/vec.h index 30caf06..fcb9e96 100644 --- a/include/vec.h +++ b/include/vec.h @@ -1,8 +1,6 @@ #ifndef _DEF_VEC #define _DEF_VEC -#define VEC_PRECISION 512 - typedef struct Vec { int x; diff --git a/src/camera.c b/src/camera.c index 16b484a..a238be8 100644 --- a/src/camera.c +++ b/src/camera.c @@ -1,6 +1,7 @@ #include #include "camera.h" +#include "conf.h" #include "vec.h" #include "debug.h" @@ -11,10 +12,16 @@ void camera_step(Camera *camera) void camera_draw_debug(Camera *camera) { + Vec draw_pos; + vec_cpy(&draw_pos, camera->pos); + vec_mul(&draw_pos, SCALE); + vec_div(&draw_pos, VEC_PRECISION); + uint8_t color; #ifdef FX9860G - dpixel(camera->pos.x / VEC_PRECISION, camera->pos.y / VEC_PRECISION, C_BLACK); + color = C_BLACK; #endif /* FX9860G */ #ifdef FXCG50 - dpixel(camera->pos.x / VEC_PRECISION, camera->pos.y / VEC_PRECISION, C_RED); + color = C_RED; #endif /* FXCG50 */ + dpixel(draw_pos.x, draw_pos.y, color); } diff --git a/src/main.c b/src/main.c index 676207b..96e2824 100644 --- a/src/main.c +++ b/src/main.c @@ -45,7 +45,7 @@ int play_level(int level_id) Camera camera = { .pos = {DWIDTH * VEC_PRECISION, DHEIGHT * VEC_PRECISION}, .target = &player.pos, - .speed = 0.05 + .speed = 0.01 }; /* create input manager */ @@ -54,28 +54,30 @@ int play_level(int level_id) input.keys[K_RIGHT] = KEY_RIGHT; input.keys[K_UP] = KEY_UP; input.keys[K_DOWN] = KEY_DOWN; + input.keys[K_EXIT] = KEY_EXIT; - /* FPS control */ + /* UPS control */ volatile int has_ticked = 1; - timer_setup(TIMER_ANY, 1000000/FPS, callback, &has_ticked); - timer_start(0); + timer_start(timer_setup(TIMER_ANY, 1000000/UPS, callback, &has_ticked)); - while (camera.pos.x / VEC_PRECISION != player.pos.x / VEC_PRECISION || - camera.pos.y / VEC_PRECISION != player.pos.y / VEC_PRECISION) + uint step = 0; + + while (!input_is_down(&input, K_EXIT)) { - /* FPS control */ - while(!has_ticked) sleep(); - has_ticked = 0; /* repeat step event so the UPS is constant regardless of FPS */ for (int i = 0; i < UPS / FPS; ++i) { + /* UPS control */ + while(!has_ticked) sleep(); + has_ticked = 0; /* step event is where all the logic happens */ - step_event(&player, &level, &camera, &input); + step += 1; + step_event(&player, &level, &camera, &input, step); } /* draw event just draws stuff */ - draw_event(&player, &level, &camera, &input); + draw_event(&player, &level, &camera, &input, step); } - return 0; + return 1; } int callback(volatile void *arg) @@ -85,7 +87,7 @@ int callback(volatile void *arg) return 0; } -void step_event(Player *player, Level *level, Camera *camera, Input *input) +void step_event(Player *player, Level *level, Camera *camera, Input *input, uint step) { //getkey(); input_step(input); @@ -94,7 +96,7 @@ void step_event(Player *player, Level *level, Camera *camera, Input *input) camera_step(camera); } -void draw_event(Player *player, Level *level, Camera *camera, Input *input) +void draw_event(Player *player, Level *level, Camera *camera, Input *input, uint step) { dclear(C_WHITE); level_draw(level, camera); @@ -102,7 +104,7 @@ void draw_event(Player *player, Level *level, Camera *camera, Input *input) #ifdef DEBUG camera_draw_debug(camera); //input_draw_debug(input); - player_draw_debug(player); + player_draw_debug(player, step); #endif dupdate(); } diff --git a/src/player.c b/src/player.c index 5ba7d55..dd37940 100644 --- a/src/player.c +++ b/src/player.c @@ -1,21 +1,17 @@ #include #include "player.h" +#include "conf.h" #include "camera.h" #include "input.h" void player_step(Player *player, Input *input) { Vec move = { - (input_is_down(input, K_RIGHT) - input_is_down(input, K_LEFT)) * VEC_PRECISION, - (input_is_down(input, K_DOWN) - input_is_down(input, K_UP)) * VEC_PRECISION + (input_is_down(input, K_RIGHT) - input_is_down(input, K_LEFT)), + (input_is_down(input, K_DOWN) - input_is_down(input, K_UP)) }; - #ifdef FX9860G - vec_div(&move, 50); - #endif /* FX9860G */ - #ifdef FXCG50 - vec_mul(&move, 2); - #endif /* FXCG50 */ + vec_mul(&move, 32 * PXS); vec_add(&player->pos, move); } @@ -29,19 +25,17 @@ void player_draw(Player *player, Camera *camera) vec_add(&draw_pos_br, player->hbox); vec_div(&draw_pos_tl, VEC_PRECISION); vec_div(&draw_pos_br, VEC_PRECISION); - #ifdef FX9860G - drect(draw_pos_tl.x, draw_pos_tl.y, draw_pos_br.x, draw_pos_br.y, C_LIGHT); - #endif /* FX9860G */ - #ifdef FXCG50 + vec_mul(&draw_pos_tl, SCALE); + vec_mul(&draw_pos_br, SCALE); drect(draw_pos_tl.x, draw_pos_tl.y, draw_pos_br.x, draw_pos_br.y, C_BLACK); - #endif /* FXCG50 */ } -void player_draw_debug(Player *player) +void player_draw_debug(Player *player, uint step) { dprint(0, 0, C_BLACK, "x: %d", player->pos.x); dprint(0, 10, C_BLACK, "y: %d", player->pos.y); dprint(0, 20, C_BLACK, "tx: %d", player->pos.x / VEC_PRECISION); dprint(0, 30, C_BLACK, "ty: %d", player->pos.y / VEC_PRECISION); dprint(0, 40, C_BLACK, "vp: %d", VEC_PRECISION); + dprint(0, 50, C_BLACK, "st: %u", step); }