Better camera offset system

This commit is contained in:
KikooDX 2020-09-21 14:52:28 +02:00
parent 470ac9b783
commit a8234e35b6
6 changed files with 15 additions and 8 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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)

View File

@ -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);

View File

@ -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 */

View File

@ -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);
}