parent
74d31e5744
commit
8307944517
|
@ -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);
|
||||
|
|
68
src/player.c
68
src/player.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue