Dynamic Y draw offset depending on player position.

This commit is contained in:
KikooDX 2021-03-05 23:16:53 +01:00
parent 84848ff3fd
commit 7383e0fd61
6 changed files with 18 additions and 13 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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