diff --git a/inc/conf.h b/inc/conf.h index e3d81f7..5671156 100644 --- a/inc/conf.h +++ b/inc/conf.h @@ -13,3 +13,5 @@ #define GRAVITY 0.3f #define JUMP_SPEED -6.0f #define JUMP_BREAK 3 +#define JUMP_BUFFER 12 +#define JUMP_GRACE 6 diff --git a/inc/player.h b/inc/player.h index 75b11b6..0257881 100644 --- a/inc/player.h +++ b/inc/player.h @@ -7,6 +7,7 @@ struct Player { struct Vec pos; struct VecF spd, rem; enum AirState air_state; + int jump_buffer, jump_grace; }; void player_init(struct Player *); diff --git a/src/player.c b/src/player.c index 60cd907..484ce97 100644 --- a/src/player.c +++ b/src/player.c @@ -19,6 +19,8 @@ player_init(struct Player *p) p->pos.y = TILE_SIZE; reset_speed(p, 1, 1); p->air_state = AS_NEUTRAL; + p->jump_buffer = 0; + p->jump_grace = 0; } void @@ -57,10 +59,22 @@ player_update(struct Player *p) break; } + /* jump buffer */ + if (kp_jump) + p->jump_buffer = JUMP_BUFFER; + else if (p->jump_buffer) + p->jump_buffer--; + /* jump grace */ + if (on_ground) + p->jump_grace = JUMP_GRACE; + else if (p->jump_grace) + p->jump_grace--; /* jump */ - if (on_ground && kp_jump) { + if (p->jump_grace && p->jump_buffer && k_jump) { p->spd.y = JUMP_SPEED; p->air_state = AS_RISING; + p->jump_buffer = 0; + p->jump_grace = 0; } player_move(p, update_rem(p));