Dynamic Y draw offset depending on player position.
This commit is contained in:
parent
84848ff3fd
commit
7383e0fd61
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
10
src/level.c
10
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];
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue