From 62cdb1ec7f46633667d7e5bdb9465c32a632e444 Mon Sep 17 00:00:00 2001 From: KikooDX Date: Tue, 22 Sep 2020 13:20:16 +0200 Subject: [PATCH] [new] Collision system base + miscellaneous code improvements and small bugfixes --- include/collide.h | 13 +++++++++++++ include/debug.h | 2 +- include/level.h | 6 +++--- include/player.h | 3 ++- src/camera.c | 2 +- src/collide.c | 21 +++++++++++++++++++++ src/level.c | 6 +++--- src/main.c | 4 ++-- src/player.c | 12 +++++++----- 9 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 include/collide.h create mode 100644 src/collide.c diff --git a/include/collide.h b/include/collide.h new file mode 100644 index 0000000..61bbd95 --- /dev/null +++ b/include/collide.h @@ -0,0 +1,13 @@ +#ifndef _DEF_PLAYER_COLLIDE +#define _DEF_PLAYER_COLLIDE + +#include + +#include "conf.h" +#include "level.h" + +/* return tile at the given position + * -1 is out of bound */ +uint8_t collide_point(Vec point, const Level *level, uint layer); + +#endif /* _DEF_PLAYER_COLLIDE */ diff --git a/include/debug.h b/include/debug.h index fba3ab2..d536a4b 100644 --- a/include/debug.h +++ b/include/debug.h @@ -1 +1 @@ -//#define DEBUG +#define DEBUG diff --git a/include/level.h b/include/level.h index 4dec195..1478ebc 100644 --- a/include/level.h +++ b/include/level.h @@ -7,10 +7,10 @@ typedef struct Level { - uint width; /* in tiles */ - uint height; /* in tiles */ + int width; /* in tiles */ + int height; /* in tiles */ const uint8_t **layers; /* points toward the level content */ - uint layers_count; + int layers_count; } Level; void level_step(const Level *level); diff --git a/include/player.h b/include/player.h index 0b5ea3a..673646e 100644 --- a/include/player.h +++ b/include/player.h @@ -2,6 +2,7 @@ #define _DEF_PLAYER #include "vec.h" +#include "level.h" #include "camera.h" #include "input.h" @@ -15,6 +16,6 @@ typedef struct Player void player_step(Player *player, Input *input); void player_draw(Player *player, Camera *camera); -void player_draw_debug(Player *player, uint step); +void player_draw_debug(Player *player, uint step, const Level *level, uint layer_id); #endif /* _DEF_PLAYER */ diff --git a/src/camera.c b/src/camera.c index c3d42d9..0d47587 100644 --- a/src/camera.c +++ b/src/camera.c @@ -14,7 +14,7 @@ void camera_step(Camera *camera) vec_cpy(offset, camera->pos); vec_div(offset, VEC_PRECISION); Vec scaled_dcenter = VEC_DCENTER; - vec_div(&scaled_dcenter, 2); + vec_div(&scaled_dcenter, SCALE); vec_sub(offset, scaled_dcenter); } diff --git a/src/collide.c b/src/collide.c new file mode 100644 index 0000000..2f60c78 --- /dev/null +++ b/src/collide.c @@ -0,0 +1,21 @@ +#include + +#include "collide.h" +#include "conf.h" +#include "level.h" + +uint8_t collide_point(Vec point, const Level *level, uint layer_id) +{ + Vec cursor; /* the final position to test */ + vec_cpy(&cursor, point); + vec_div(&cursor, VEC_PRECISION * TILE_SIZE); /* get the expected tile ID */ + if (point.x < 0 || point.y < 0 || + cursor.x >= level->width || cursor.y >= level->height) + { + return -1; /* the point is out of bounds */ + } + else + { + return level->layers[layer_id][cursor.x + cursor.y * level->width]; + } +} diff --git a/src/level.c b/src/level.c index 2cc17bc..3e910a2 100644 --- a/src/level.c +++ b/src/level.c @@ -16,13 +16,13 @@ void level_draw(const Level *level, Camera *camera) void layer_draw(const Level *level, Camera *camera, uint layer_id) { const uint8_t *layer = level->layers[layer_id]; - for (uint y = 0; y < level->height; ++y) + for (int y = 0; y < level->height; ++y) { - for (uint x = 0; x < level->width; ++x) + for (int x = 0; x < level->width; ++x) { const uint8_t cell = layer[x + y * level->width]; #ifdef FX9860G - const int color = C_BLACK; + const int color = C_LIGHT; #endif /* FX9860G */ #ifdef FXCG50 const int color = C_GREEN; diff --git a/src/main.c b/src/main.c index 4187735..a2ebdd7 100644 --- a/src/main.c +++ b/src/main.c @@ -98,9 +98,9 @@ void draw_event(Player *player, const Level *level, Camera *camera, Input *input level_draw(level, camera); player_draw(player, camera); #ifdef DEBUG - camera_draw_debug(camera); + //camera_draw_debug(camera); //input_draw_debug(input); - player_draw_debug(player, step); + player_draw_debug(player, step, level, 0); #endif dupdate(); } diff --git a/src/player.c b/src/player.c index 4456344..dde51bb 100644 --- a/src/player.c +++ b/src/player.c @@ -4,6 +4,7 @@ #include "conf.h" #include "camera.h" #include "input.h" +#include "collide.h" void player_step(Player *player, Input *input) { @@ -32,12 +33,13 @@ void player_draw(Player *player, Camera *camera) vec_drect(tl, br, C_BLACK); } -void player_draw_debug(Player *player, uint step) +void player_draw_debug(Player *player, uint step, const Level *level, uint layer_id) { 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, "dx: %d", player->pos.x / SCALE * VEC_PRECISION); - dprint(0, 30, C_BLACK, "dy: %d", player->pos.y / SCALE * VEC_PRECISION); - dprint(0, 40, C_BLACK, "vp: %d", VEC_PRECISION); - dprint(0, 50, C_BLACK, "st: %u", step); + dprint(0, 20, C_BLACK, "vp: %d", VEC_PRECISION); + dprint(0, 30, C_BLACK, "st: %u", step); + dprint(0, 40, C_BLACK, "cx: %d", player->pos.x / (VEC_PRECISION * TILE_SIZE)); + dprint(0, 50, C_BLACK, "cy: %d", player->pos.y / (VEC_PRECISION * TILE_SIZE)); + dprint(0, 60, C_BLACK, "cl: %d", collide_point(player->pos, level, layer_id)); }