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
	
	 Sara
						Sara