Tweak player's movement and jump code

This commit is contained in:
Abdelrahman Said 2024-11-10 01:59:27 +00:00
parent 434b73226e
commit e2c781098c

View File

@ -13,11 +13,12 @@
void get_player_controls(Player *player);
void set_x_movement (Player *player);
void player_move (Player *player);
void player_dash (Player *player);
void player_jump (Player *player);
void player_fall (Player *player);
int32_t player_gravity (Player *player);
bool player_on_ground (Player *player);
int32_t player_gravity (Player *player);
State *update_state (Player *player, uint32_t state);
State *idle_state (StateMachine *sm, Player *player);
State *walk_state (StateMachine *sm, Player *player);
@ -41,7 +42,7 @@ void player_init(Player *player, SDL_Renderer *renderer, SDL_Rect position) {
player->animations[PLAYER_STATE_JUMP] =
ap_init(renderer, "knight_player/Jump_KG_2.png", 100, SPRITE_WIDTH, SPRITE_HEIGHT, false);
player->animations[PLAYER_STATE_FALL] =
ap_init(renderer, "knight_player/Fall_KG_2.png", 80, SPRITE_WIDTH, SPRITE_HEIGHT, false);
ap_init(renderer, "knight_player/Fall_KG_2.png", 50, SPRITE_WIDTH, SPRITE_HEIGHT, false);
player->states[PLAYER_STATE_IDLE] = (State){ .state_func = (StateFunc *)idle_state };
player->states[PLAYER_STATE_WALK] = (State){ .state_func = (StateFunc *)walk_state };
@ -57,13 +58,7 @@ void player_init(Player *player, SDL_Renderer *renderer, SDL_Rect position) {
void player_update(Player *player, uint32_t ticks) {
get_player_controls(player);
sm_run(&(player->state_machine), (void *)player);
player->position.x += player->movement.x;
player->position.y += player->movement.y;
if (player->position.y > player->base_y) {
player->position.y = player->base_y;
}
player_move(player);
ap_update(&(player->animations[player->current_state]), ticks);
}
@ -98,24 +93,36 @@ void set_x_movement(Player *player) {
}
}
void player_move(Player *player) {
player->position.x += player->movement.x;
player->position.y += player->movement.y;
if (player->position.y > player->base_y) {
player->position.y = player->base_y;
}
}
void player_dash(Player *player) {
player->movement.x = player->x_direction * player->velocity * 2;
}
void player_jump(Player *player) {
player->movement.y = player->velocity * 6 * -1;
player->movement.y = player->velocity * 7 * -1;
}
void player_fall(Player *player) {
player->movement.y = player->velocity * 6;
}
bool player_on_ground(Player *player) {
return player->position.y == player->base_y;
}
int32_t player_gravity(Player *player) {
return player->velocity * 0.5;
}
bool player_on_ground(Player *player) {
return player->position.y == player->base_y;
bool player_falling(Player *player) {
return player->movement.y > 0;
}
State *update_state(Player *player, uint32_t state) {
@ -221,7 +228,7 @@ State *fall_state(StateMachine *sm, Player *player) {
bool reset = false;
uint32_t state = PLAYER_STATE_FALL;
if (player->animations[PLAYER_STATE_FALL].finished || player_on_ground(player)) {
if (player->animations[PLAYER_STATE_FALL].finished && player_on_ground(player)) {
player->movement.y = 0;
reset = true;
state = PLAYER_STATE_IDLE;