diff --git a/include/main.h b/include/main.h index f4e4fbd..a01cee7 100644 --- a/include/main.h +++ b/include/main.h @@ -1,7 +1,5 @@ #pragma once -#define PLAYER_SIZE 16 - #define TILE_S 8 #define TILESET_W 12 #define TILESET_H 6 diff --git a/include/player.h b/include/player.h index 6e8f26d..8a862d4 100644 --- a/include/player.h +++ b/include/player.h @@ -1,10 +1,13 @@ #pragma once #include "main.h" -#define PLAYER_ACC 0.8 -#define BASE_FRIC 0.2 -#define GRAVITY 0.4 -#define JUMP_H 6 +#define PLAYER_SIZE 12 + +#define PLAYER_ACC 1 +#define BASE_FRIC 0.2 +#define GRAVITY 0.4 +#define JUMP_H 7 +#define COYOTE_TIME 3 Player player_reset(Player player, Level level); Vec2 search(tile_t x, Level level); diff --git a/src/main.c b/src/main.c index 8131fb9..c5089a0 100644 --- a/src/main.c +++ b/src/main.c @@ -111,7 +111,11 @@ main(void) input_init(); Player player = {.pos = {50, 50}, .spawn = {0, 0}, .spd = {0, 0}}; Vec2 camera = {0, 0}; + int running = 1; + int jumping = 1; + int airbreak = 1; + int coyote = 0; while (running) { @@ -154,21 +158,43 @@ main(void) player.pos.x + PLAYER_SIZE - camera.x - 1, player.pos.y + PLAYER_SIZE - camera.y - 1, C_BLACK); - dprint(10, 10, C_BLACK, "%d", player.pos.x); - dprint(10, 30, C_BLACK, "%d", player.pos.y); + dprint(10, 10, C_BLACK, "%d", jumping); /* input */ input_step(); Vec2 mov = { .x = input_down(K_RIGHT) - input_down(K_LEFT), - .y = input_down(K_DOWN) - input_down(K_UP), + .y = 0, }; - player.spd.x *= (1 - BASE_FRIC); /* friction */ - player.spd.y *= (1 - BASE_FRIC); /* friction */ - player.spd.x += mov.x * PLAYER_ACC; /* idem */ - player.spd.y += mov.y * PLAYER_ACC; /* idem */ + /* on the ground */ + if (collide((Vec2){player.pos.x, player.pos.y + 1}, 0, 1, + level)) { + jumping = 0; + airbreak = 0; + coyote = COYOTE_TIME; + } else { + --coyote; + } + + /* JUMP */ + if (input_pressed(K_A) && coyote > 0) { + player.spd.y = -JUMP_H; + jumping = 2; + coyote = 0; + airbreak = 0; + } + + /* airbreak */ + if (!airbreak && (!input_down(K_A) || player.spd.y > 0)) { + airbreak = 1; + } + + /* moving */ + player.spd.x *= (1 - BASE_FRIC); /* friction */ + player.spd.x += mov.x * PLAYER_ACC; /* idem */ + player.spd.y += GRAVITY + (GRAVITY * airbreak); /* gravity */ if (player.spd.x > -0.2 && player.spd.x < 0.2) { player.spd.x = 0; @@ -180,6 +206,7 @@ main(void) Res_Mov position = move(player, level); /* i'm crying rn */ player = position.player; + /* if the player collide with a wall */ if (position.moved.x) { player.spd.x = 0; } diff --git a/src/player.c b/src/player.c index a102c9a..1df39e7 100644 --- a/src/player.c +++ b/src/player.c @@ -80,6 +80,9 @@ collide(Vec2 pos, int h, tile_t obj, Level level) const Vec2 pos_tl = (Vec2){pos.x + h, pos.y + h}; const Vec2 pos_br = (Vec2){pos.x + PLAYER_SIZE - h - 1, pos.y + PLAYER_SIZE - h - 1}; + const Vec2 middle = + (Vec2){pos.x + PLAYER_SIZE / 2, pos.y + PLAYER_SIZE / 2}; + /* Check if there's something in */ /* the square (x, y, x + 15, y + 15) */ /* The size of the hitbox changes with h */ @@ -87,7 +90,11 @@ collide(Vec2 pos, int h, tile_t obj, Level level) if (collide_pixel(pos_tl, obj, level) || collide_pixel(pos_br, obj, level) || collide_pixel((Vec2){pos_tl.x, pos_br.y}, obj, level) || - collide_pixel((Vec2){pos_br.x, pos_tl.y}, obj, level)) { + collide_pixel((Vec2){pos_br.x, pos_tl.y}, obj, level) || + collide_pixel((Vec2){middle.x, pos_tl.y}, obj, level) || + collide_pixel((Vec2){middle.x, pos_br.y}, obj, level) || + collide_pixel((Vec2){pos_tl.x, middle.y}, obj, level) || + collide_pixel((Vec2){pos_br.x, middle.y}, obj, level)) { return 1; } return 0;