feat(player): players state machine is now it's own file
This commit is contained in:
parent
70a64dfc77
commit
eb871a9d5f
|
@ -1,10 +1,10 @@
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
|
#include "PlayerStates.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "game_world.h"
|
#include "game_world.h"
|
||||||
#include "input_axis.h"
|
#include "input_axis.h"
|
||||||
|
|
||||||
#define WALK_SPEED_H 1.f
|
const Vector PLAYER_SPEED = MakeVector(1.0f, 0.70f);
|
||||||
#define WALK_SPEED_V 0.75f
|
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
void Internal_PlayerInitInput(Player* self) {
|
void Internal_PlayerInitInput(Player* self) {
|
||||||
|
@ -36,11 +36,14 @@ Player* MakePlayer() {
|
||||||
.animationStateMachine = NULL,
|
.animationStateMachine = NULL,
|
||||||
};
|
};
|
||||||
sprite_set_origin(self->sprite, MakeVector(0.45f, 1.f));
|
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->idle = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Idle.png", IVectorFrom(512)), 1.5f, LoopMode_Loop);
|
||||||
self->jab_a = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Jab_A.png", IVectorFrom(522)), 10.f);
|
self->walk = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Walk.png", IVectorFrom(512)), 5.f, LoopMode_Loop);
|
||||||
self->jab_b = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Jab_B.png", IVectorFrom(522)), 10.f);
|
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());
|
self->animationStateMachine = state_machine_init(self, PlayerIdle());
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,11 +63,11 @@ void DestroyPlayer(Player* self) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerHorizontalInput(Player* self, InputEvent value) {
|
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) {
|
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) {
|
void PlayerAttackInput(Player* self, InputEvent value) {
|
||||||
|
@ -81,71 +84,3 @@ void PlayerUpdate(Player* self, float deltaTime) {
|
||||||
void PlayerDraw(Player* self) {
|
void PlayerDraw(Player* self) {
|
||||||
animation_sprite_draw(self->currentAnimation, &self->transform);
|
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();
|
|
||||||
}
|
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#include "transform.h"
|
#include "transform.h"
|
||||||
#include "player_input.h"
|
#include "player_input.h"
|
||||||
|
|
||||||
|
extern const Vector PLAYER_SPEED;
|
||||||
|
|
||||||
typedef struct Player {
|
typedef struct Player {
|
||||||
Transform transform;
|
Transform transform;
|
||||||
|
|
||||||
|
@ -52,42 +54,4 @@ impl_BehaviourEntity_for(Player,
|
||||||
PlayerDraw
|
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
|
#endif // !FIGHT_PLAYER_H
|
||||||
|
|
79
game/src/PlayerStates.c
Normal file
79
game/src/PlayerStates.c
Normal file
|
@ -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();
|
||||||
|
}
|
48
game/src/PlayerStates.h
Normal file
48
game/src/PlayerStates.h
Normal file
|
@ -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
|
Loading…
Reference in a new issue