91 lines
2.7 KiB
C
91 lines
2.7 KiB
C
#include "PlayerStates.h"
|
|
#include "Player.h"
|
|
#include "physics_world.h"
|
|
#include "debug.h"
|
|
|
|
static inline
|
|
void InternalSpriteFlipWithMovement(Player* self) {
|
|
if(self->moveInput.x > 0.f)
|
|
self->facing = 1;
|
|
if(self->moveInput.x < -0.1f)
|
|
self->facing = -1;
|
|
sprite_flip_horizontal(self->sprite, self->facing != 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);
|
|
|
|
Collider* found = physics_world_box_query(vaddf(self->transform.position, MakeVector(self->facing * (0.2f + 0.1f), 0.f)),
|
|
MakeVector(0.1f, 0.06f), PHYSICS_LAYER_DEFAULT, self->rigidbody);
|
|
|
|
if(found != NULL)
|
|
LOG_INFO("Query returned %p", found);
|
|
}
|
|
|
|
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();
|
|
}
|