forked from kdx/jtmm2-old
Better camera offset system
This commit is contained in:
parent
470ac9b783
commit
a8234e35b6
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue