From d40d6a5fb49c5823aa8ef1a812c95d9995c4ead4 Mon Sep 17 00:00:00 2001 From: KikooDX Date: Thu, 4 Mar 2021 16:54:05 +0100 Subject: [PATCH] Bugfixes + bugfixes that do not fix the bugs. --- include/player.h | 2 +- kble.py | 2 +- src/level.c | 1 + src/main.c | 3 ++- src/player.c | 43 +++++++++++++++++++------------------------ src/tiles.c | 14 +++++++------- 6 files changed, 31 insertions(+), 34 deletions(-) diff --git a/include/player.h b/include/player.h index 568fab0..7f18860 100644 --- a/include/player.h +++ b/include/player.h @@ -40,7 +40,7 @@ typedef struct Player{ #include "level.h" -Player player_init(); +void player_init(Player *player); void player_update(Player *player, Level *level, Input input, u8 *level_id); void player_draw(Player player); /* Helper functions. */ diff --git a/kble.py b/kble.py index b0f2e57..6ba282d 100644 --- a/kble.py +++ b/kble.py @@ -103,7 +103,7 @@ if __name__ == "__main__": start_x, start_y = x, y c_file.write("},\n") c_file.write("\t\t.start_pos = (Vec2){") - c_file.write(f"{start_x} * TILE_SIZE, {start_y} * TILE_SIZE") + c_file.write(f"{start_x} * TILE_SIZE + 2, {start_y} * TILE_SIZE + 4") c_file.write("}\n\t},\n") c_file.write("};") diff --git a/src/level.c b/src/level.c index b76f13a..d4d0117 100644 --- a/src/level.c +++ b/src/level.c @@ -38,6 +38,7 @@ void level_load(Level *level, Player *player, u8 id) { extern Level levels[LEVEL_SIZE]; memcpy(level->content, levels[id].content, LEVEL_SIZE); level->start_pos = levels[id].start_pos; + player_init(player); player->pos = levels[id].start_pos; } diff --git a/src/main.c b/src/main.c index 663bcb9..176bff0 100644 --- a/src/main.c +++ b/src/main.c @@ -22,7 +22,8 @@ int callback(volatile void *arg) { int main(void) { /* Initialize player. */ - Player player = player_init(); + Player player; + player_init(&player); /* Initialize level. */ Level level = (Level){}; u8 level_id = 0; diff --git a/src/player.c b/src/player.c index 56c3a56..ad58520 100644 --- a/src/player.c +++ b/src/player.c @@ -14,18 +14,16 @@ #include "input.h" #include "tiles.h" -Player player_init() { - return (Player){ - .pos = (Vec2){0, 0}, - .spd_x = 0.0, - .spd_y = 0.0, - .facing = 1, - .stun = false, - .knocked = false, - .keys_left = 0, - .jump_buffer = 0, - .coyot = 0, - }; +void player_init(Player *player) { + player->pos = (Vec2){0, 0}; + player->spd_x = 0.0; + player->spd_y = 0.0; + player->facing = 1; + player->stun = false; + player->knocked = false; + player->keys_left = 0; + player->jump_buffer = 0; + player->coyot = 0; } void player_update(Player *player, Level *level, Input input, u8 *level_id) { @@ -35,9 +33,9 @@ void player_update(Player *player, Level *level, Input input, u8 *level_id) { player_collide(*level, one_px_down, SEMI_SOLID_TILE, 0); if (!player->stun) { /* Get input. */ - const i8 move_x = + const i8 move_x = sign( input_is_down(input, K_RIGHT) - - input_is_down(input, K_LEFT); + input_is_down(input, K_LEFT)); const bool fastfall = input_is_down(input, K_DOWN); const bool jump_pressed = input_is_pressed(input, K_JUMP); const bool jump_held = input_is_down(input, K_JUMP); @@ -51,9 +49,9 @@ void player_update(Player *player, Level *level, Input input, u8 *level_id) { player->spd_x *= 1 - AIR_FRICTION; /* Acceleration. */ if (on_ground) - player->spd_x += (f32)(move_x) * GROUND_ACCELERATION; + player->spd_x += move_x * GROUND_ACCELERATION; else - player->spd_x += (f32)(move_x) * AIR_ACCELERATION; + player->spd_x += move_x * AIR_ACCELERATION; /* Gravity. */ player->spd_y += GRAVITY; /* Vertical friction. */ @@ -78,9 +76,6 @@ void player_update(Player *player, Level *level, Input input, u8 *level_id) { player->jump_buffer = 0; player->coyot = 0; } - /* Move the player. */ - player_move(player, *level, round(player->spd_x), 0); - player_move(player, *level, 0, round(player->spd_y)); } else { /* Gravity. */ @@ -97,7 +92,7 @@ void player_update(Player *player, Level *level, Input input, u8 *level_id) { /* If player hit a wall in stun mode, turn back. */ if (hit_wall_x && player->stun) { player->facing *= -1; - player->spd_x = KNOCKBACK_X; + player->spd_x = KNOCKBACK_X * -player->facing; } /* Damageboost a.k.a. stun mode. */ if (player_collide(*level, player->pos, PAIN_TILE, 5)) { @@ -133,9 +128,9 @@ void player_draw(Player player) { /* Draw colored rectangle depending on player state. */ u32 color = 0; if (player.stun) - color = C_RGB(230/4, 41/4, 55/4); /* Red. */ + color = C_RGB((230/4), (41/4), (55/4)); /* Red. */ else - color = C_RGB(0/4, 121/4, 241/4); /* Blue. */ + color = C_RGB((0/4), (121/4), (241/4)); /* Blue. */ const vec2_int_t x = player.pos.x + DRAW_OFFSET_X; const vec2_int_t y = player.pos.y + DRAW_OFFSET_Y; drect(x, y, x + PLAYER_WIDTH - 1, y + PLAYER_HEIGHT - 1, color); @@ -145,9 +140,9 @@ void player_draw(Player player) { bool player_collide(Level level, Vec2 pos, tile_t tile, u8 margin) { const vec2_int_t left = pos.x + margin; - const vec2_int_t right = pos.x + PLAYER_WIDTH - 1 - margin * 2; + const vec2_int_t right = pos.x + PLAYER_WIDTH - 1 - margin; const vec2_int_t up = pos.y + margin; - const vec2_int_t down = pos.y + PLAYER_HEIGHT - 1 - margin * 2; + const vec2_int_t down = pos.y + PLAYER_HEIGHT - 1 - margin; return ((tile == level_get_tile_at_px(level, (Vec2){left, up})) || (tile == level_get_tile_at_px(level, (Vec2){right, up})) || (tile == level_get_tile_at_px(level, (Vec2){left, down})) || diff --git a/src/tiles.c b/src/tiles.c index 03a35b3..362aef2 100644 --- a/src/tiles.c +++ b/src/tiles.c @@ -11,13 +11,13 @@ u32 tile_color(tile_t tile) { int color = 0; switch (tile) { - case AIR_TILE: color = C_RGB(0/4, 0/4, 0/4); break; - case SOLID_TILE: color = C_RGB(10/4, 210/4, 180/4); break; - case PAIN_TILE: color = C_RGB(210/4, 10/4, 180/4); break; - case SPAWN_TILE: color = C_RGB(20/4, 220/4, 20/4); break; - case EXIT_TILE: color = C_RGB(250/4, 220/4, 10/4); break; - case KEY_TILE: color = C_RGB(210/4, 210/4, 210/4); break; - case SEMI_SOLID_TILE: color = C_RGB(5/4, 105/4, 90/4); break; + case AIR_TILE: color = C_RGB((0/4), (0/4), (0/4)); break; + case SOLID_TILE: color = C_RGB((10/4), (210/4), (180/4)); break; + case PAIN_TILE: color = C_RGB((210/4), (10/4), (180/4)); break; + case SPAWN_TILE: color = C_RGB((20/4), (220/4), (20/4)); break; + case EXIT_TILE: color = C_RGB((250/4), (220/4), (10/4)); break; + case KEY_TILE: color = C_RGB((210/4), (210/4), (210/4)); break; + case SEMI_SOLID_TILE: color = C_RGB((5/4), (105/4), (90/4)); break; } return color; }