feat: added player kick state
This commit is contained in:
parent
255c4ce6db
commit
1fb0aedac2
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue