Player code progress.

Me stupid.
This commit is contained in:
KikooDX 2021-03-04 11:19:28 +01:00
parent 74d31e5744
commit 8307944517
2 changed files with 68 additions and 3 deletions

View File

@ -24,7 +24,7 @@
#define AIR_ACCELERATION 1.0
#define GROUND_FRICTION (GROUND_ACCELERATION / MAX_HORIZONTAL_SPEED)
#define AIR_FRICTION (AIR_ACCELERATION / MAX_HORIZONTAL_SPEED)
#define KNOCKBACK_Y (0 - JUMP_SPD + 2.0)
#define KNOCKBACK_Y (-(JUMP_SPD) + 2.0)
#define KNOCKBACK_X MAX_HORIZONTAL_SPEED
typedef struct Player{
@ -46,4 +46,5 @@ void player_draw(Player player);
bool player_collide(Level level, Vec2 pos, tile_t tile, u8 margin);
bool player_move(Player *player, Level level, i8 spd_x, i8 spd_y);
i8 sign(i8 value);
f32 signf(f32 value);
i8 round(f32 value);

View File

@ -54,10 +54,65 @@ void player_update(Player *player, Level *level, Input input, u8 *level_id) {
player->spd_x += (f32)(move_x) * GROUND_ACCELERATION;
else
player->spd_x += (f32)(move_x) * AIR_ACCELERATION;
/* Gravity. */
player->spd_y += GRAVITY;
/* Vertical friction. */
if (fastfall && player->spd_y > 0)
player->spd_y *= 1 - FASTFALL_RESISTANCE;
else
player->spd_y *= 1 - FALL_RESISTANCE;
/* Jump logic. */
/** Coyot jump. */
if (on_ground)
player->coyot = COYOT;
else if (player->coyot > 0)
player->coyot -= 1;
/** Input buffer. */
if (jump_pressed)
player->jump_buffer = JUMP_BUFFER;
else if (player->jump_buffer > 0)
player->jump_buffer -= 1;
/** Jump. */
if (jump_held && player->coyot > 0 && player->jump_buffer > 0) {
player->spd_y = JUMP_SPD;
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. */
player->spd_y += GRAVITY;
/* Vertical friction. */
player->spd_y *= 1 - FALL_RESISTANCE;
}
/* Semi-solid platform stop fall. */
if (player->spd_y > 0 && player_collide(*level, player->pos, SEMI_SOLID_TILE, 0))
player->spd_y = 0;
/* Apply movement. */
const bool hit_wall_x = player_move(player, *level, round(player->spd_x), 0);
player_move(player, *level, 0, round(player->spd_y));
/* If player hit a wall in stun mode, turn back. */
if (hit_wall_x && player->stun) {
player->facing *= -1;
player->spd_x = KNOCKBACK_X;
}
/* Damageboost a.k.a. stun mode. */
if (player_collide(*level, player->pos, PAIN_TILE, 5)) {
if (!player->knocked) {
player->spd_y = -signf(player->spd_y) * KNOCKBACK_Y;
player->spd_x = -signf(player->facing) * KNOCKBACK_X;
player->knocked = true;
}
player->stun = true;
}
else {
player->knocked = false;
if (on_ground)
player->stun = false;
}
}
void player_draw(Player player) {
@ -90,8 +145,8 @@ bool player_move(Player *player, Level level, i8 spd_x, i8 spd_y) {
player->pos.y += spd_y;
/* If player is in solid, move back until it ain't. */
if (player_collide(level, player->pos, SOLID_TILE, 0)) {
const u8 sign_spd_x = sign(spd_x);
const u8 sign_spd_y = sign(spd_y);
const i8 sign_spd_x = sign(spd_x);
const i8 sign_spd_y = sign(spd_y);
if (sign_spd_x != 0) player->spd_x = 0;
if (sign_spd_y != 0) player->spd_y = 0;
while (player_collide(level, player->pos, SOLID_TILE, 0)) {
@ -112,6 +167,15 @@ i8 sign(i8 value) {
return 0;
}
f32 signf(f32 value) {
if (value > 0.0)
return 1.0;
else if (value < 0.0)
return -1.0;
else
return 0.0;
}
i8 round(f32 value) {
return (i8)value;
}