From 1fb0aedac29a37cd20a458ff3ab9e2b834ff4edd Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 12 Jan 2024 16:22:12 +0100 Subject: [PATCH] feat: added player kick state --- game/src/Player.c | 12 ++++++---- game/src/Player.h | 5 ++-- game/src/PlayerStates.c | 51 +++++++++++++++++++++++++++++++++-------- game/src/PlayerStates.h | 9 ++++++++ 4 files changed, 61 insertions(+), 16 deletions(-) diff --git a/game/src/Player.c b/game/src/Player.c index ac3befc..fb074b9 100644 --- a/game/src/Player.c +++ b/game/src/Player.c @@ -46,10 +46,10 @@ void Internal_PlayerInitInput(Player* self) { (InputDelegateFn)PlayerVerticalInput); playerinput_add(self->playerInput, KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_J)), - (InputDelegateFn)PlayerJabInput); + (InputDelegateFn)PlayerLightAttackInput); playerinput_add(self->playerInput, KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_K)), - (InputDelegateFn)PlayerHeavyInput); + (InputDelegateFn)PlayerHeavyAttackInput); } Player* MakePlayer() { @@ -75,6 +75,7 @@ Player* MakePlayer() { .walk = NULL, .jab_a = NULL, .jab_b = NULL, + .kick_a = 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->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->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()); @@ -134,14 +136,14 @@ void PlayerVerticalInput(Player* self, InputEvent value) { self->moveInput.y = -value.as_float; } -void PlayerJabInput(Player* self, InputEvent value) { +void PlayerLightAttackInput(Player* self, InputEvent value) { if(value.as_bool) self->attackInput = 1; } -void PlayerHeavyInput(Player* self, InputEvent value) { +void PlayerHeavyAttackInput(Player* self, InputEvent value) { if(value.as_bool) - self->attackInput = 1; + self->attackInput = 2; } void PlayerStart(Player* self) { diff --git a/game/src/Player.h b/game/src/Player.h index c607c52..cc48776 100644 --- a/game/src/Player.h +++ b/game/src/Player.h @@ -34,6 +34,7 @@ typedef struct Player { AnimationSprite* walk; AnimationSprite* jab_a; AnimationSprite* jab_b; + AnimationSprite* kick_a; StateMachine* animationStateMachine; @@ -46,8 +47,8 @@ void DestroyPlayer(Player* self); void PlayerHorizontalInput(Player* self, InputEvent value); void PlayerVerticalInput(Player* self, InputEvent value); -void PlayerJabInput(Player* self, InputEvent value); -void PlayerHeavyInput(Player* self, InputEvent value); +void PlayerLightAttackInput(Player* self, InputEvent value); +void PlayerHeavyAttackInput(Player* self, InputEvent value); void PlayerStart(Player* self); void PlayerUpdate(Player* self, float deltaTime); diff --git a/game/src/PlayerStates.c b/game/src/PlayerStates.c index ea57b17..aaa0faa 100644 --- a/game/src/PlayerStates.c +++ b/game/src/PlayerStates.c @@ -27,8 +27,10 @@ void PlayerIdleEnter(Player* self) { const State* PlayerIdleUpdate(Player* self, float deltaTime) { if(!veqf(self->moveInput, ZeroVector)) return PlayerWalk(); - if(self->attackInput) + if(self->attackInput == 1) return PlayerJabA(); + if(self->attackInput == 2) + return PlayerKickA(); return PlayerIdle(); } @@ -42,8 +44,10 @@ const State* PlayerWalk_Update(Player* self, float deltaTime) { if(veqf(self->moveInput, ZeroVector)) return PlayerIdle(); - if(self->attackInput) + if(self->attackInput == 1) return PlayerJabA(); + if(self->attackInput == 2) + return PlayerKickA(); InternalSpriteFlipWithMovement(self); return PlayerWalk(); } @@ -55,9 +59,13 @@ void PlayerAttackEnter(Player* self) { } static -void PlayerAttackTrigger(Player* self) { - 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_COMBAT, self->rigidbody); +void PlayerAttackTrigger(Player* self, DamageEventData* damage, Vector hitbox_size) { + Vector collider_edge = self->facing + ? 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) { PhysicsEntity entity = collider_get_owner(found); 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); if(self->animationTriggers == 0 && ntime > 0.33f) PlayerAttackTrigger(self); - if(self->attackInput && ntime > 1.0f) - return PlayerJabB(); + if(ntime > 1.0f) { + if(self->attackInput == 1) + return PlayerJabB(); + else if(self->attackInput == 2) + return PlayerKickA(); + } if(!veqf(self->moveInput, ZeroVector) && ntime > 1.05f) return PlayerWalk(); 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); if(self->animationTriggers == 0 && ntime > 0.33f) PlayerAttackTrigger(self); - if(self->attackInput && ntime > 1.0f) - return PlayerJabA(); + if(ntime > 1.0f) { + if(self->attackInput == 1) + return PlayerJabA(); + else if(self->attackInput == 2) + return PlayerKickA(); + } if(!veqf(self->moveInput, ZeroVector) && ntime > 1.05f) return PlayerWalk(); if(ntime >= 2.0f) return PlayerIdle(); 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(); +} diff --git a/game/src/PlayerStates.h b/game/src/PlayerStates.h index 0bcc9b6..df2f67d 100644 --- a/game/src/PlayerStates.h +++ b/game/src/PlayerStates.h @@ -45,4 +45,13 @@ DefineState(PlayerJabB, Player, 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