fencer/game/src/PlayerStates.c

83 lines
2.4 KiB
C

#include "PlayerStates.h"
#include "Player.h"
static inline
void InternalSpriteFlipWithMovement(Player* self) {
if(self->moveInput.x > 0.f)
sprite_flip_horizontal(self->sprite, 0);
if(self->moveInput.x < -0.1f)
sprite_flip_horizontal(self->sprite, 1);
}
void PlayerAnimationExit(Player* self) {}
void PlayerIdleEnter(Player* self) {
self->currentAnimation = self->idle;
animation_sprite_play_from(self->currentAnimation, 0.f);
}
const State* PlayerIdleUpdate(Player* self, float deltaTime) {
if(!veqf(self->moveInput, ZeroVector))
return PlayerWalk();
if(self->attackInput)
return PlayerJabA();
return PlayerIdle();
}
void PlayerWalk_Enter(Player* self) {
self->currentAnimation = self->walk;
animation_sprite_play_from(self->currentAnimation, 0.f);
}
const State* PlayerWalk_Update(Player* self, float deltaTime) {
rigidbody_set_velocity(self->rigidbody, vmulf(vnormalizedf(self->moveInput), PLAYER_SPEED));
if(veqf(self->moveInput, ZeroVector))
return PlayerIdle();
if(self->attackInput)
return PlayerJabA();
InternalSpriteFlipWithMovement(self);
return PlayerWalk();
}
void PlayerAttackEnter(Player* self) {
self->attackInput = 0;
rigidbody_set_velocity(self->rigidbody, ZeroVector);
InternalSpriteFlipWithMovement(self);
}
void PlayerJabA_Enter(Player* self) {
PlayerAttackEnter(self);
self->currentAnimation = self->jab_a;
animation_sprite_play_from(self->currentAnimation, 0.f);
}
const State* PlayerJabA_Update(Player* self, float deltaTime) {
const float ntime = animation_sprite_get_time_normalized(self->currentAnimation);
if(ntime >= 2.0f)
return PlayerIdle();
if(self->attackInput && ntime > 1.0f)
return PlayerJabB();
if(!veqf(self->moveInput, ZeroVector) && ntime > 1.05f)
return PlayerWalk();
return PlayerJabA();
}
void PlayerJabB_Enter(Player* self) {
PlayerAttackEnter(self);
self->currentAnimation = self->jab_b;
animation_sprite_play_from(self->currentAnimation, 0.f);
}
const State* PlayerJabB_Update(Player* self, float deltaTime) {
const float ntime = animation_sprite_get_time_normalized(self->currentAnimation);
if(ntime >= 2.f)
return PlayerIdle();
if(self->attackInput && ntime > 1.0f)
return PlayerJabA();
if(!veqf(self->moveInput, ZeroVector) && ntime > 1.05f)
return PlayerWalk();
return PlayerJabB();
}