mirror of https://git.sr.ht/~kikoodx/momento
parent
fc4c5bd156
commit
b99611e526
4
README
4
README
|
@ -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 |
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue