diff --git a/README b/README index 6673a91..fade511 100644 --- a/README +++ b/README @@ -2,6 +2,10 @@ More Than Enough Mechanics ========================== Serenity +Build dependencies +------------------ +gint toolchain, mkg3a + LICENSE ======= Copyright (C) 2021 KikooDX diff --git a/assets/graphics/player/blink.png b/assets/graphics/player/blink.png index 6b36784..e3393e6 100644 Binary files a/assets/graphics/player/blink.png and b/assets/graphics/player/blink.png differ diff --git a/include/player.h b/include/player.h index 2100d89..9b032a5 100644 --- a/include/player.h +++ b/include/player.h @@ -12,6 +12,9 @@ enum AirState { AirRising, AirBreaking, AirNeutral }; #define AIR_BREAKING_FACTOR 3 +enum AnimState { AnimIdle, AnimBlink, AnimWalk, AnimAirborn, AnimJump }; +#define BLINK_DELAY 120 + struct Player { int x; int y; @@ -30,6 +33,8 @@ struct Player { struct Particle idle_anim; struct Particle jump_anim; struct Particle walk_anim; + enum AnimState anim_state; + int blink_timer; int trail_state; }; diff --git a/src/player/init.c b/src/player/init.c index 4f28daf..166d828 100644 --- a/src/player/init.c +++ b/src/player/init.c @@ -30,6 +30,7 @@ player_init(void) .jumps_left = 0, .air_state = AirNeutral, .trail_state = 0, + .blink_timer = BLINK_DELAY, }; /* initialize animations */ @@ -38,6 +39,7 @@ player_init(void) player.jump_anim = particle_init(&img_player_jump, 0, 0, 8, 6, 0, 0); player.walk_anim = particle_init(&img_player_walk, 0, 0, 12, 6, 1, 0); player.anim = player.idle_anim; + player.anim_state = AnimIdle; /* find spawn position in level */ x = level.width; diff --git a/src/player/update.c b/src/player/update.c index c853640..1103982 100644 --- a/src/player/update.c +++ b/src/player/update.c @@ -11,6 +11,7 @@ #include static void player_move(struct Player *player, int x, int y); +static void player_set_anim(struct Player *player, enum AnimState new_anim); extern struct Level level; @@ -139,16 +140,50 @@ player_update(struct Player *player, struct Input input) } /* update animation */ - if (jumped) - player->anim = player->jump_anim; - particle_update(&player->anim); - if (player->anim.life == 0) { - if (dir_x != 0) - player->anim = player->walk_anim; - else - player->anim = player->idle_anim; + /* jump anim */ + if (jumped) { + player->anim = player->jump_anim; + player->anim_state = AnimJump; + } + + /* update depending on animation states */ + switch (player->anim_state) { + case AnimIdle: + if (player->blink_timer > 0) + player->blink_timer -= 1; + else if (player->blink_timer == 0) + player_set_anim(player, AnimBlink); + + if (!on_ground) + player_set_anim(player, AnimAirborn); + else if (dir_x) + player_set_anim(player, AnimWalk); + break; + case AnimBlink: + if (!on_ground) + player_set_anim(player, AnimAirborn); + else if (dir_x) + player_set_anim(player, AnimWalk); + else if (player->anim.life == 0) + player_set_anim(player, AnimIdle); + break; + case AnimWalk: + if (!on_ground) + player_set_anim(player, AnimAirborn); + else if (!dir_x) + player_set_anim(player, AnimIdle); + break; + case AnimAirborn: + if (on_ground) + player_set_anim(player, AnimIdle); + break; + case AnimJump: + if (player->anim.life == 0) + player_set_anim(player, AnimIdle); + default: + break; } /* horizontal flip */ @@ -181,3 +216,30 @@ player_move(struct Player *player, int x, int y) } while (player_collide_solid(player->x, player->y)); } } + +static void +player_set_anim(struct Player *player, enum AnimState new_anim) +{ + player->anim_state = new_anim; + switch (new_anim) { + case AnimIdle: + player->anim = player->idle_anim; + player->blink_timer = BLINK_DELAY; + break; + case AnimBlink: + player->anim = player->blink_anim; + break; + case AnimWalk: + player->anim = player->walk_anim; + break; + case AnimAirborn: + player->anim = player->idle_anim; + break; + case AnimJump: + player->anim = player->jump_anim; + break; + default: + player->anim = player->idle_anim; + break; + } +}