diff --git a/game/src/Player.c b/game/src/Player.c index 08ba0ff..ee07398 100644 --- a/game/src/Player.c +++ b/game/src/Player.c @@ -1,10 +1,10 @@ #include "Player.h" +#include "PlayerStates.h" #include "debug.h" #include "game_world.h" #include "input_axis.h" -#define WALK_SPEED_H 1.f -#define WALK_SPEED_V 0.75f +const Vector PLAYER_SPEED = MakeVector(1.0f, 0.70f); static inline void Internal_PlayerInitInput(Player* self) { @@ -36,11 +36,14 @@ Player* MakePlayer() { .animationStateMachine = NULL, }; sprite_set_origin(self->sprite, MakeVector(0.45f, 1.f)); - self->idle = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Idle.png", IVectorFrom(522)), 1.5f); - self->walk = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Walk.png", IVectorFrom(522)), 5.f); - self->jab_a = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Jab_A.png", IVectorFrom(522)), 10.f); - self->jab_b = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Jab_B.png", IVectorFrom(522)), 10.f); + + self->idle = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Idle.png", IVectorFrom(512)), 1.5f, LoopMode_Loop); + self->walk = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Walk.png", IVectorFrom(512)), 5.f, LoopMode_Loop); + self->jab_a = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Jab_A.png", IVectorFrom(512)), 10.f, LoopMode_Stop); + self->jab_b = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Jab_B.png", IVectorFrom(512)), 10.f, LoopMode_Stop); + self->animationStateMachine = state_machine_init(self, PlayerIdle()); + return self; } @@ -60,11 +63,11 @@ void DestroyPlayer(Player* self) { } void PlayerHorizontalInput(Player* self, InputEvent value) { - self->moveInput.x = value.as_float * WALK_SPEED_H; + self->moveInput.x = value.as_float; } void PlayerVerticalInput(Player* self, InputEvent value) { - self->moveInput.y = -value.as_float * WALK_SPEED_V; + self->moveInput.y = -value.as_float; } void PlayerAttackInput(Player* self, InputEvent value) { @@ -81,71 +84,3 @@ void PlayerUpdate(Player* self, float deltaTime) { void PlayerDraw(Player* self) { animation_sprite_draw(self->currentAnimation, &self->transform); } - -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) { - if(veqf(self->moveInput, ZeroVector)) - return PlayerIdle(); - if(self->attackInput) - return PlayerJabA(); - - if(self->moveInput.x > 0.f) - sprite_flip_horizontal(self->sprite, 0); - if(self->moveInput.x < -0.1f) - sprite_flip_horizontal(self->sprite, 1); - - self->transform.position = vaddf(self->transform.position, vmulff(self->moveInput, deltaTime)); - - return PlayerWalk(); -} - -void PlayerJabA_Enter(Player* self) { - self->attackInput = 0; - self->currentAnimation = self->jab_a; - animation_sprite_play_from(self->currentAnimation, 0.f); -} - -const State* PlayerJabA_Update(Player* self, float deltaTime) { - if(animation_sprite_get_time_normalized(self->currentAnimation) >= 2.0f) { - if(self->attackInput) - return PlayerJabB(); - else - return PlayerIdle(); - } - - return PlayerJabA(); -} - -void PlayerJabB_Enter(Player* self) { - self->attackInput = 0; - self->currentAnimation = self->jab_b; - animation_sprite_play_from(self->currentAnimation, 0.f); -} - -const State* PlayerJabB_Update(Player* self, float deltaTime) { - if(animation_sprite_get_time_normalized(self->currentAnimation) >= 2.0f) { - return PlayerIdle(); - } - - return PlayerJabB(); -} diff --git a/game/src/Player.h b/game/src/Player.h index 3c8f754..178651b 100644 --- a/game/src/Player.h +++ b/game/src/Player.h @@ -10,6 +10,8 @@ #include "transform.h" #include "player_input.h" +extern const Vector PLAYER_SPEED; + typedef struct Player { Transform transform; @@ -52,42 +54,4 @@ impl_BehaviourEntity_for(Player, PlayerDraw ) -void PlayerAnimationExit(Player* self); - -void PlayerIdleEnter(Player* self); -const State* PlayerIdleUpdate(Player* self, float deltaTime); - -DefineState(PlayerIdle, Player, - PlayerIdleEnter, - PlayerIdleUpdate, - PlayerAnimationExit -) - -void PlayerWalk_Enter(Player* self); -const State* PlayerWalk_Update(Player* self, float deltaTime); - -DefineState(PlayerWalk, Player, - PlayerWalk_Enter, - PlayerWalk_Update, - PlayerAnimationExit -) - -void PlayerJabA_Enter(Player* self); -const State* PlayerJabA_Update(Player* self, float deltaTime); - -DefineState(PlayerJabA, Player, - PlayerJabA_Enter, - PlayerJabA_Update, - PlayerAnimationExit -) - -void PlayerJabB_Enter(Player* self); -const State* PlayerJabB_Update(Player* self, float deltaTime); - -DefineState(PlayerJabB, Player, - PlayerJabB_Enter, - PlayerJabB_Update, - PlayerAnimationExit -) - #endif // !FIGHT_PLAYER_H diff --git a/game/src/PlayerStates.c b/game/src/PlayerStates.c new file mode 100644 index 0000000..3f80a74 --- /dev/null +++ b/game/src/PlayerStates.c @@ -0,0 +1,79 @@ +#include "PlayerStates.h" +#include "Player.h" + +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) { + if(veqf(self->moveInput, ZeroVector)) + return PlayerIdle(); + if(self->attackInput) + return PlayerJabA(); + + if(self->moveInput.x > 0.f) + sprite_flip_horizontal(self->sprite, 0); + if(self->moveInput.x < -0.1f) + sprite_flip_horizontal(self->sprite, 1); + + self->transform.position = vaddf(self->transform.position, vmulff(vmulf(vnormalizedf(self->moveInput), PLAYER_SPEED), deltaTime)); + + return PlayerWalk(); +} + +void PlayerAttackEnter(Player* self) { + self->attackInput = 0; + + PlayerWalk_Update(self, 0.f); +} + +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.1f) + return PlayerJabA(); + if(!veqf(self->moveInput, ZeroVector) && ntime > 1.05f) + return PlayerWalk(); + return PlayerJabB(); +} diff --git a/game/src/PlayerStates.h b/game/src/PlayerStates.h new file mode 100644 index 0000000..0bcc9b6 --- /dev/null +++ b/game/src/PlayerStates.h @@ -0,0 +1,48 @@ +#ifndef FIGHT_PLAYER_STATES_H +#define FIGHT_PLAYER_STATES_H + +#include "state.h" + +typedef struct Player Player; + +void PlayerAnimationExit(Player* self); + +void PlayerIdleEnter(Player* self); +const State* PlayerIdleUpdate(Player* self, float deltaTime); + +DefineState(PlayerIdle, Player, + PlayerIdleEnter, + PlayerIdleUpdate, + PlayerAnimationExit +) + +void PlayerWalk_Enter(Player* self); +const State* PlayerWalk_Update(Player* self, float deltaTime); + +DefineState(PlayerWalk, Player, + PlayerWalk_Enter, + PlayerWalk_Update, + PlayerAnimationExit +) + +void PlayerAttackEnter(Player* self); + +void PlayerJabA_Enter(Player* self); +const State* PlayerJabA_Update(Player* self, float deltaTime); + +DefineState(PlayerJabA, Player, + PlayerJabA_Enter, + PlayerJabA_Update, + PlayerAnimationExit +) + +void PlayerJabB_Enter(Player* self); +const State* PlayerJabB_Update(Player* self, float deltaTime); + +DefineState(PlayerJabB, Player, + PlayerJabB_Enter, + PlayerJabB_Update, + PlayerAnimationExit +) + +#endif // !FIGHT_PLAYER_STATES_H