Player can jump

Jump in the air, touch the sky
This commit is contained in:
KikooDX 2021-03-31 11:51:03 +02:00
parent b5ccc8536c
commit e47d3fb4b2
5 changed files with 31 additions and 5 deletions

View File

@ -13,3 +13,6 @@
#define FRC_AIR (ACC_AIR / MAX_HSPD)
#define AIR_RES 0.02
#define GRAVITY 0.2
#define JUMP_SPD -4.0
#define JUMP_BUFFER 10
#define JUMP_GRACE 10

View File

@ -14,6 +14,10 @@ struct Player {
float spd_y;
float rem_x;
float rem_y;
/* keys and buffering */
int k_jump_previous;
int jump_buffer;
int jump_grace;
};
/* used for collisions */

View File

@ -8,10 +8,5 @@ extern bopti_image_t bimg_player;
void player_draw(struct Player player)
{
Tile collisions[COLLIDE_POINTS];
int i;
player_collide(collisions, player.x, player.y);
for (i = 0; i < COLLIDE_POINTS; i += 1)
dprint(0, i * 20, C_WHITE, "%d: %d", i, collisions[i]);
dimage(player.x, player.y, &bimg_player);
}

View File

@ -17,6 +17,9 @@ struct Player player_init(void)
.spd_y = 0.0,
.rem_x = 0.0,
.rem_y = 0.0,
.k_jump_previous = 0,
.jump_buffer = 0,
.jump_grace = 0,
};
/* find spawn position in level */

View File

@ -16,6 +16,9 @@ void player_update(struct Player *player)
/* process input */
const int dir_x = keydown(KEY_RIGHT) - keydown(KEY_LEFT);
/* const int dir_y = keydown(KEY_DOWN) - keydown(KEY_UP); */
const int k_jump = keydown(KEY_SHIFT);
const int kp_jump = k_jump && (!player->k_jump_previous);
player->k_jump_previous = k_jump;
/* horizontal friction/acceleration */
player->spd_x *= (on_ground) ? (1 - FRC_GND) : (1 - FRC_AIR);
@ -38,6 +41,24 @@ void player_update(struct Player *player)
player->spd_y += GRAVITY * factor;
}
/* input buffer */
if (kp_jump)
player->jump_buffer = JUMP_BUFFER;
else if (player->jump_buffer)
player->jump_buffer -= 1;
/* grace frames */
if (on_ground)
player->jump_grace = JUMP_GRACE;
else if (player->jump_grace)
player->jump_grace -= 1;
/* jump (youhou) */
if (k_jump && player->jump_buffer && player->jump_grace) {
player->spd_y = JUMP_SPD;
player->jump_buffer = 0;
player->jump_grace = 0;
}
/* speed reminder */
const float spd_n_rem_x = player->spd_x + player->rem_x;
const int spd_x = (int)spd_n_rem_x;