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);
|
||||
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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue