diff --git a/include/conf.h b/include/conf.h index 2b28028..4504986 100644 --- a/include/conf.h +++ b/include/conf.h @@ -12,5 +12,7 @@ #define LEVEL_WIDTH 16 #define LEVEL_HEIGHT 16 #define LEVEL_SIZE (LEVEL_WIDTH * LEVEL_HEIGHT) +#define LEVEL_WIDTH_PX (LEVEL_WIDTH * TILE_SIZE) +#define LEVEL_HEIGHT_PX (LEVEL_HEIGHT * TILE_SIZE) #define DRAW_OFFSET_X 70 #define DRAW_OFFSET_Y -16 diff --git a/include/level.h b/include/level.h index 1be0d56..023b55c 100644 --- a/include/level.h +++ b/include/level.h @@ -19,6 +19,6 @@ typedef struct Level{ #include "player.h" void level_load(Level *level, Player *player, u8 id); -void level_draw(Level level); +void level_draw(Level level, i16 y_offset); tile_t level_get_tile_at_px(Level level, Vec2 pos); void level_set_tile_at_px(Level *level, Vec2 pos, tile_t tile); diff --git a/include/player.h b/include/player.h index 905ff4f..f67b270 100644 --- a/include/player.h +++ b/include/player.h @@ -42,7 +42,7 @@ typedef struct Player{ void player_init(Player *player); void player_update(Player *player, Level *level, Input input, u8 *level_id); -void player_draw(Player player); +void player_draw(Player player, i16 y_offset); /* Helper functions. */ bool player_collide(Level level, Vec2 pos, tile_t tile, u8 margin); bool player_move(Player *player, Level level, i8 spd_x, i8 spd_y); diff --git a/src/level.c b/src/level.c index 35ceb5f..b4e826a 100644 --- a/src/level.c +++ b/src/level.c @@ -13,10 +13,10 @@ #include "player.h" #include "vec2.h" -void level_draw(Level level) { +void level_draw(Level level, i16 y_offset) { /* Pixel position (where we draw). */ - u16 x = DRAW_OFFSET_X; - u16 y = DRAW_OFFSET_Y; + i32 x = DRAW_OFFSET_X; + i16 y = y_offset; /* Cursor position. */ u8 cx = 0; while (cx < LEVEL_WIDTH) { @@ -28,7 +28,7 @@ void level_draw(Level level) { y += TILE_SIZE; cy += 1; } - y = DRAW_OFFSET_Y; + y = y_offset; x += TILE_SIZE; cx += 1; } @@ -52,7 +52,7 @@ tile_t level_get_tile_at_px(Level level, Vec2 pos) { u8 x = pos.x / TILE_SIZE; u8 y = pos.y / TILE_SIZE; /* Out of bounds check. */ - if (pos.x >= LEVEL_WIDTH * TILE_SIZE || pos.y >= LEVEL_HEIGHT * TILE_SIZE) + if (pos.x >= LEVEL_WIDTH_PX || pos.y >= LEVEL_HEIGHT_PX) return OUT_OF_BOUNDS; /* If everything is OK, get the tile and return it. */ return level.content[x + y * LEVEL_WIDTH]; diff --git a/src/main.c b/src/main.c index 176bff0..16105f1 100644 --- a/src/main.c +++ b/src/main.c @@ -48,10 +48,13 @@ int main(void) { input_update(&input); player_update(&player, &level, input, &level_id); } + /* Calculate y offset ("camera"). */ + const i16 y_offset = ((f32)player.pos.y / (f32)LEVEL_HEIGHT_PX) * + (DHEIGHT - LEVEL_HEIGHT_PX); /* Draw. */ dclear(C_BLACK); - level_draw(level); - player_draw(player); + level_draw(level, y_offset); + player_draw(player, y_offset); dupdate(); } diff --git a/src/player.c b/src/player.c index 317b225..55ac548 100644 --- a/src/player.c +++ b/src/player.c @@ -111,8 +111,8 @@ void player_update(Player *player, Level *level, Input input, u8 *level_id) { /* Return to last checkpoint if out of bounds. */ if ((player->pos.x <= -PLAYER_WIDTH) || (player->pos.y <= -PLAYER_HEIGHT) || - (player->pos.x >= LEVEL_WIDTH * TILE_SIZE) || - (player->pos.y >= LEVEL_HEIGHT * TILE_SIZE)) + (player->pos.x >= LEVEL_WIDTH_PX) || + (player->pos.y >= LEVEL_HEIGHT_PX)) { player_init(player); player->pos = level->start_pos; @@ -126,7 +126,7 @@ void player_update(Player *player, Level *level, Input input, u8 *level_id) { } } -void player_draw(Player player) { +void player_draw(Player player, i16 y_offset) { /* Draw colored rectangle depending on player state. */ u32 color = 0; if (player.stun) @@ -134,7 +134,7 @@ void player_draw(Player player) { else color = C_RGB(0/8, 121/8, 241/8); /* Blue. */ const vec2_int_t x = player.pos.x + DRAW_OFFSET_X; - const vec2_int_t y = player.pos.y + DRAW_OFFSET_Y; + const vec2_int_t y = player.pos.y + y_offset; drect(x, y, x + PLAYER_WIDTH - 1, y + PLAYER_HEIGHT - 1, color); }