feat: added player kick state

This commit is contained in:
Sara 2024-01-12 16:22:12 +01:00
parent 255c4ce6db
commit 1fb0aedac2
4 changed files with 61 additions and 16 deletions

View file

@ -46,10 +46,10 @@ void Internal_PlayerInitInput(Player* self) {
(InputDelegateFn)PlayerVerticalInput); (InputDelegateFn)PlayerVerticalInput);
playerinput_add(self->playerInput, playerinput_add(self->playerInput,
KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_J)), KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_J)),
(InputDelegateFn)PlayerJabInput); (InputDelegateFn)PlayerLightAttackInput);
playerinput_add(self->playerInput, playerinput_add(self->playerInput,
KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_K)), KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_K)),
(InputDelegateFn)PlayerHeavyInput); (InputDelegateFn)PlayerHeavyAttackInput);
} }
Player* MakePlayer() { Player* MakePlayer() {
@ -75,6 +75,7 @@ Player* MakePlayer() {
.walk = NULL, .walk = NULL,
.jab_a = NULL, .jab_a = NULL,
.jab_b = NULL, .jab_b = NULL,
.kick_a = NULL,
.animationStateMachine = NULL, .animationStateMachine = NULL,
}; };
@ -93,6 +94,7 @@ Player* MakePlayer() {
self->walk = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Walk.png", IVectorFrom(512)), 5.f, 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_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->jab_b = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Jab_B.png", IVectorFrom(512)), 10.f, LoopMode_Stop);
self->kick_a = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Kick_A.png", IVectorFrom(512)), 10.f, LoopMode_Stop);
self->animationStateMachine = state_machine_init(self, PlayerIdle()); self->animationStateMachine = state_machine_init(self, PlayerIdle());
@ -134,14 +136,14 @@ void PlayerVerticalInput(Player* self, InputEvent value) {
self->moveInput.y = -value.as_float; self->moveInput.y = -value.as_float;
} }
void PlayerJabInput(Player* self, InputEvent value) { void PlayerLightAttackInput(Player* self, InputEvent value) {
if(value.as_bool) if(value.as_bool)
self->attackInput = 1; self->attackInput = 1;
} }
void PlayerHeavyInput(Player* self, InputEvent value) { void PlayerHeavyAttackInput(Player* self, InputEvent value) {
if(value.as_bool) if(value.as_bool)
self->attackInput = 1; self->attackInput = 2;
} }
void PlayerStart(Player* self) { void PlayerStart(Player* self) {

View file

@ -34,6 +34,7 @@ typedef struct Player {
AnimationSprite* walk; AnimationSprite* walk;
AnimationSprite* jab_a; AnimationSprite* jab_a;
AnimationSprite* jab_b; AnimationSprite* jab_b;
AnimationSprite* kick_a;
StateMachine* animationStateMachine; StateMachine* animationStateMachine;
@ -46,8 +47,8 @@ void DestroyPlayer(Player* self);
void PlayerHorizontalInput(Player* self, InputEvent value); void PlayerHorizontalInput(Player* self, InputEvent value);
void PlayerVerticalInput(Player* self, InputEvent value); void PlayerVerticalInput(Player* self, InputEvent value);
void PlayerJabInput(Player* self, InputEvent value); void PlayerLightAttackInput(Player* self, InputEvent value);
void PlayerHeavyInput(Player* self, InputEvent value); void PlayerHeavyAttackInput(Player* self, InputEvent value);
void PlayerStart(Player* self); void PlayerStart(Player* self);
void PlayerUpdate(Player* self, float deltaTime); void PlayerUpdate(Player* self, float deltaTime);

View file

@ -27,8 +27,10 @@ void PlayerIdleEnter(Player* self) {
const State* PlayerIdleUpdate(Player* self, float deltaTime) { const State* PlayerIdleUpdate(Player* self, float deltaTime) {
if(!veqf(self->moveInput, ZeroVector)) if(!veqf(self->moveInput, ZeroVector))
return PlayerWalk(); return PlayerWalk();
if(self->attackInput) if(self->attackInput == 1)
return PlayerJabA(); return PlayerJabA();
if(self->attackInput == 2)
return PlayerKickA();
return PlayerIdle(); return PlayerIdle();
} }
@ -42,8 +44,10 @@ const State* PlayerWalk_Update(Player* self, float deltaTime) {
if(veqf(self->moveInput, ZeroVector)) if(veqf(self->moveInput, ZeroVector))
return PlayerIdle(); return PlayerIdle();
if(self->attackInput) if(self->attackInput == 1)
return PlayerJabA(); return PlayerJabA();
if(self->attackInput == 2)
return PlayerKickA();
InternalSpriteFlipWithMovement(self); InternalSpriteFlipWithMovement(self);
return PlayerWalk(); return PlayerWalk();
} }
@ -55,9 +59,13 @@ void PlayerAttackEnter(Player* self) {
} }
static static
void PlayerAttackTrigger(Player* self) { void PlayerAttackTrigger(Player* self, DamageEventData* damage, Vector hitbox_size) {
Collider* found = physics_world_box_query(vaddf(self->transform.position, MakeVector(self->facing * (0.2f + 0.1f), 0.f)), Vector collider_edge = self->facing
MakeVector(0.1f, 0.06f), PHYSICS_LAYER_COMBAT, self->rigidbody); ? shape_get_max_extent(collider_get_shape(self->physicsCollider), &self->transform)
: shape_get_min_extent(collider_get_shape(self->physicsCollider), &self->transform);
//Vector hitbox_size = MakeVector(0.1f, 0.06f);
Vector hitbox_position = vaddf(self->transform.position, MakeVector(0.1f + collider_edge.x, 0.0f));
Collider* found = physics_world_box_query(vaddf(self->transform.position, hitbox_position), hitbox_size, PHYSICS_LAYER_COMBAT, self->rigidbody);
if(found != NULL) { if(found != NULL) {
PhysicsEntity entity = collider_get_owner(found); PhysicsEntity entity = collider_get_owner(found);
const IDamagable* damagable = mirror_get_typeclass(entity.data, entity.mirror, "Damagable"); const IDamagable* damagable = mirror_get_typeclass(entity.data, entity.mirror, "Damagable");
@ -82,8 +90,12 @@ const State* PlayerJabA_Update(Player* self, float deltaTime) {
const float ntime = animation_sprite_get_time_normalized(self->currentAnimation); const float ntime = animation_sprite_get_time_normalized(self->currentAnimation);
if(self->animationTriggers == 0 && ntime > 0.33f) if(self->animationTriggers == 0 && ntime > 0.33f)
PlayerAttackTrigger(self); PlayerAttackTrigger(self);
if(self->attackInput && ntime > 1.0f) if(ntime > 1.0f) {
return PlayerJabB(); if(self->attackInput == 1)
return PlayerJabB();
else if(self->attackInput == 2)
return PlayerKickA();
}
if(!veqf(self->moveInput, ZeroVector) && ntime > 1.05f) if(!veqf(self->moveInput, ZeroVector) && ntime > 1.05f)
return PlayerWalk(); return PlayerWalk();
if(ntime >= 2.0f) if(ntime >= 2.0f)
@ -101,11 +113,32 @@ const State* PlayerJabB_Update(Player* self, float deltaTime) {
const float ntime = animation_sprite_get_time_normalized(self->currentAnimation); const float ntime = animation_sprite_get_time_normalized(self->currentAnimation);
if(self->animationTriggers == 0 && ntime > 0.33f) if(self->animationTriggers == 0 && ntime > 0.33f)
PlayerAttackTrigger(self); PlayerAttackTrigger(self);
if(self->attackInput && ntime > 1.0f) if(ntime > 1.0f) {
return PlayerJabA(); if(self->attackInput == 1)
return PlayerJabA();
else if(self->attackInput == 2)
return PlayerKickA();
}
if(!veqf(self->moveInput, ZeroVector) && ntime > 1.05f) if(!veqf(self->moveInput, ZeroVector) && ntime > 1.05f)
return PlayerWalk(); return PlayerWalk();
if(ntime >= 2.0f) if(ntime >= 2.0f)
return PlayerIdle(); return PlayerIdle();
return PlayerJabB(); return PlayerJabB();
} }
void PlayerKickA_Enter(Player* self) {
PlayerAttackEnter(self);
self->currentAnimation = self->kick_a;
animation_sprite_play_from(self->currentAnimation, 0.f);
}
const State* PlayerKickA_Update(Player* self, float deltaTime) {
const float ntime = animation_sprite_get_time_normalized(self->currentAnimation);
if(ntime > 1.0f && self->attackInput == 1)
return PlayerJabA();
if(!veqf(self->moveInput, ZeroVector) && ntime > 1.05f)
return PlayerWalk();
if(ntime >= 2.0f)
return PlayerIdle();
return PlayerKickA();
}

View file

@ -45,4 +45,13 @@ DefineState(PlayerJabB, Player,
PlayerAnimationExit PlayerAnimationExit
) )
void PlayerKickA_Enter(Player* self);
const State* PlayerKickA_Update(Player* self, float deltaTime);
DefineState(PlayerKickA, Player,
PlayerKickA_Enter,
PlayerKickA_Update,
PlayerAnimationExit
)
#endif // !FIGHT_PLAYER_STATES_H #endif // !FIGHT_PLAYER_STATES_H