Bugfixes + bugfixes that do not fix the bugs.
This commit is contained in:
parent
acd1e8d961
commit
d40d6a5fb4
|
@ -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. */
|
||||
|
|
2
kble.py
2
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("};")
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
43
src/player.c
43
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})) ||
|
||||
|
|
14
src/tiles.c
14
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue