From a8234e35b65402953a735112d854921ad2cc305a Mon Sep 17 00:00:00 2001 From: KikooDX Date: Mon, 21 Sep 2020 14:52:28 +0200 Subject: [PATCH] Better camera offset system --- include/camera.h | 1 + include/player.h | 3 ++- src/camera.c | 6 ++++++ src/level.c | 3 +-- src/main.c | 3 ++- src/player.c | 7 +++---- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/include/camera.h b/include/camera.h index 879808a..ea8c9e8 100644 --- a/include/camera.h +++ b/include/camera.h @@ -7,6 +7,7 @@ typedef struct Camera { Vec pos; + Vec offset; /* adjusted pixel offset based on pos */ Vec *target; /* the target position to lerp on */ float speed; /* camera lerp speed with 0 < speed <= 1 */ } Camera; diff --git a/include/player.h b/include/player.h index a8a2729..0b5ea3a 100644 --- a/include/player.h +++ b/include/player.h @@ -8,7 +8,8 @@ typedef struct Player { Vec pos; - Vec hbox; /* the bottom right corner of the player's hitbox */ + Vec hbox; /* the bottom left corner of the player's hitbox */ + Vec vbox; /* the bottom left corner of the player's visual box */ Vec origin; /* the origin of the player (offset) */ } Player; diff --git a/src/camera.c b/src/camera.c index d7cddad..7cf9fcf 100644 --- a/src/camera.c +++ b/src/camera.c @@ -7,7 +7,13 @@ void camera_step(Camera *camera) { + /* lerp towards target */ vec_lerp(&camera->pos, *camera->target, camera->speed); + /* calculate pixel offset */ + Vec * const offset = &camera->offset; /* DRY */ + vec_cpy(offset, camera->pos); + vec_div(offset, VEC_PRECISION); + vec_sub(offset, VEC_DCENTER); } void camera_draw_debug(Camera *camera) diff --git a/src/level.c b/src/level.c index 4edeb85..c9485e3 100644 --- a/src/level.c +++ b/src/level.c @@ -32,9 +32,8 @@ void layer_draw(const Level *level, Camera *camera, uint layer_id) Vec tl = {x, y}; Vec br; vec_mul(&tl, VEC_PRECISION * TILE_SIZE); - vec_sub(&tl, camera->pos); vec_div(&tl, VEC_PRECISION); - vec_sub(&tl, VEC_DCENTER); + vec_sub(&tl, camera->offset); vec_cpy(&br, tl); vec_add(&br, (Vec){TILE_SIZE - 1, TILE_SIZE - 1}); vec_drect(tl, br, color); diff --git a/src/main.c b/src/main.c index 329eca7..4187735 100644 --- a/src/main.c +++ b/src/main.c @@ -33,6 +33,7 @@ int play_level(uint level_id) Player player = { .pos = {16 * VEC_PRECISION, 16 * VEC_PRECISION}, .hbox = {7 * VEC_PRECISION, 7 * VEC_PRECISION}, + .vbox = {7, 7}, .origin = {4 * VEC_PRECISION, 4 * VEC_PRECISION} }; @@ -44,7 +45,7 @@ int play_level(uint level_id) Camera camera = { .pos = {DWIDTH * VEC_PRECISION, DHEIGHT * VEC_PRECISION}, .target = &player.pos, - .speed = 0.01 + .speed = 0.02 }; /* create input manager */ diff --git a/src/player.c b/src/player.c index 472ba5c..fc1302e 100644 --- a/src/player.c +++ b/src/player.c @@ -21,15 +21,14 @@ void player_draw(Player *player, Camera *camera) Vec draw_pos_br; vec_cpy(&draw_pos_tl, player->pos); vec_sub(&draw_pos_tl, player->origin); - vec_sub(&draw_pos_tl, camera->pos); vec_cpy(&draw_pos_br, draw_pos_tl); - vec_add(&draw_pos_br, player->hbox); vec_div(&draw_pos_tl, VEC_PRECISION); vec_div(&draw_pos_br, VEC_PRECISION); vec_mul(&draw_pos_tl, SCALE); vec_mul(&draw_pos_br, SCALE); - vec_add(&draw_pos_tl, VEC_DCENTER); - vec_add(&draw_pos_br, VEC_DCENTER); + vec_sub(&draw_pos_tl, camera->offset); + vec_sub(&draw_pos_br, camera->offset); + vec_add(&draw_pos_br, player->vbox); vec_drect(draw_pos_tl, draw_pos_br, C_BLACK); }