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);
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) {

View file

@ -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);

View file

@ -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();
}

View file

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