player animation logic

It looks nice.
This commit is contained in:
KikooDX 2021-05-05 23:10:24 +02:00
parent fc4c5bd156
commit b99611e526
5 changed files with 81 additions and 8 deletions

4
README
View File

@ -2,6 +2,10 @@ More Than Enough Mechanics
==========================
Serenity
Build dependencies
------------------
gint toolchain, mkg3a
LICENSE
=======
Copyright (C) 2021 KikooDX <kikoodx@paranoici.org>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 B

After

Width:  |  Height:  |  Size: 166 B

View File

@ -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;
};

View File

@ -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;

View File

@ -11,6 +11,7 @@
#include <gint/keyboard.h>
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;
}
}