feat(game): added player
This commit is contained in:
parent
7d1bce119b
commit
d1870e7a19
151
game/src/Player.c
Normal file
151
game/src/Player.c
Normal file
|
@ -0,0 +1,151 @@
|
|||
#include "Player.h"
|
||||
#include "debug.h"
|
||||
#include "game_world.h"
|
||||
#include "input_axis.h"
|
||||
|
||||
#define WALK_SPEED_H 1.f
|
||||
#define WALK_SPEED_V 0.75f
|
||||
|
||||
static inline
|
||||
void Internal_PlayerInitInput(Player* self) {
|
||||
playerinput_add(self->playerInput, CompositeAxis1D_as_InputAxis(compositeaxis1d_new(
|
||||
KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_A)),
|
||||
KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_D)),
|
||||
InputEvent_Float)), (InputDelegateFn)PlayerHorizontalInput);
|
||||
playerinput_add(self->playerInput, CompositeAxis1D_as_InputAxis(compositeaxis1d_new(
|
||||
KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_S)),
|
||||
KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_W)),
|
||||
InputEvent_Float)), (InputDelegateFn)PlayerVerticalInput);
|
||||
playerinput_add(self->playerInput, KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_J)), (InputDelegateFn)PlayerAttackInput);
|
||||
}
|
||||
|
||||
Player* MakePlayer() {
|
||||
Player* self = malloc(sizeof(Player));
|
||||
ASSERT_RETURN(self != NULL, NULL, "Failed to allocate space for new Player instance");
|
||||
|
||||
*self = (Player) {
|
||||
.transform = IdentityTransform,
|
||||
.playerInput = playerinput_new(self, -1),
|
||||
.moveInput = ZeroVector,
|
||||
.attackInput = 0,
|
||||
.sprite = sprite_new_empty(),
|
||||
.idle = NULL,
|
||||
.walk = NULL,
|
||||
.jab_a = NULL,
|
||||
.jab_b = NULL,
|
||||
.animationStateMachine = NULL,
|
||||
};
|
||||
sprite_set_origin(self->sprite, MakeVector(0.45f, 1.f));
|
||||
self->idle = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Idle.png", IVectorFrom(522)), 1.5f);
|
||||
self->walk = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Walk.png", IVectorFrom(522)), 5.f);
|
||||
self->jab_a = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Jab_A.png", IVectorFrom(522)), 10.f);
|
||||
self->jab_b = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Jab_B.png", IVectorFrom(522)), 10.f);
|
||||
self->animationStateMachine = state_machine_init(self, PlayerIdle());
|
||||
return self;
|
||||
}
|
||||
|
||||
Player* SpawnPlayer(Vector location) {
|
||||
Player* self = MakePlayer();
|
||||
self->transform.position = location;
|
||||
game_world_add_entity(Player_as_BehaviourEntity(self));
|
||||
Internal_PlayerInitInput(self);
|
||||
return self;
|
||||
}
|
||||
|
||||
void DestroyPlayer(Player* self) {
|
||||
playerinput_drop(self->playerInput);
|
||||
animation_sprite_destroy(self->idle);
|
||||
animation_sprite_destroy(self->walk);
|
||||
state_machine_destroy(self->animationStateMachine);
|
||||
}
|
||||
|
||||
void PlayerHorizontalInput(Player* self, InputEvent value) {
|
||||
self->moveInput.x = value.as_float * WALK_SPEED_H;
|
||||
}
|
||||
|
||||
void PlayerVerticalInput(Player* self, InputEvent value) {
|
||||
self->moveInput.y = -value.as_float * WALK_SPEED_V;
|
||||
}
|
||||
|
||||
void PlayerAttackInput(Player* self, InputEvent value) {
|
||||
if(value.as_bool)
|
||||
self->attackInput = 1;
|
||||
}
|
||||
|
||||
void PlayerStart(Player* self) {}
|
||||
|
||||
void PlayerUpdate(Player* self, float deltaTime) {
|
||||
state_machine_update(self->animationStateMachine, deltaTime);
|
||||
}
|
||||
|
||||
void PlayerDraw(Player* self) {
|
||||
animation_sprite_draw(self->currentAnimation, &self->transform);
|
||||
}
|
||||
|
||||
void PlayerAnimationExit(Player* self) {}
|
||||
|
||||
void PlayerIdleEnter(Player* self) {
|
||||
self->currentAnimation = self->idle;
|
||||
animation_sprite_play_from(self->currentAnimation, 0.f);
|
||||
}
|
||||
|
||||
const State* PlayerIdleUpdate(Player* self, float deltaTime) {
|
||||
if(!veqf(self->moveInput, ZeroVector))
|
||||
return PlayerWalk();
|
||||
if(self->attackInput)
|
||||
return PlayerJabA();
|
||||
|
||||
return PlayerIdle();
|
||||
}
|
||||
|
||||
void PlayerWalk_Enter(Player* self) {
|
||||
self->currentAnimation = self->walk;
|
||||
animation_sprite_play_from(self->currentAnimation, 0.f);
|
||||
}
|
||||
|
||||
const State* PlayerWalk_Update(Player* self, float deltaTime) {
|
||||
if(veqf(self->moveInput, ZeroVector))
|
||||
return PlayerIdle();
|
||||
if(self->attackInput)
|
||||
return PlayerJabA();
|
||||
|
||||
if(self->moveInput.x > 0.f)
|
||||
sprite_flip_horizontal(self->sprite, 0);
|
||||
if(self->moveInput.x < -0.1f)
|
||||
sprite_flip_horizontal(self->sprite, 1);
|
||||
|
||||
self->transform.position = vaddf(self->transform.position, vmulff(self->moveInput, deltaTime));
|
||||
|
||||
return PlayerWalk();
|
||||
}
|
||||
|
||||
void PlayerJabA_Enter(Player* self) {
|
||||
self->attackInput = 0;
|
||||
self->currentAnimation = self->jab_a;
|
||||
animation_sprite_play_from(self->currentAnimation, 0.f);
|
||||
}
|
||||
|
||||
const State* PlayerJabA_Update(Player* self, float deltaTime) {
|
||||
if(animation_sprite_get_time_normalized(self->currentAnimation) >= 2.0f) {
|
||||
if(self->attackInput)
|
||||
return PlayerJabB();
|
||||
else
|
||||
return PlayerIdle();
|
||||
}
|
||||
|
||||
return PlayerJabA();
|
||||
}
|
||||
|
||||
void PlayerJabB_Enter(Player* self) {
|
||||
self->attackInput = 0;
|
||||
self->currentAnimation = self->jab_b;
|
||||
animation_sprite_play_from(self->currentAnimation, 0.f);
|
||||
}
|
||||
|
||||
const State* PlayerJabB_Update(Player* self, float deltaTime) {
|
||||
if(animation_sprite_get_time_normalized(self->currentAnimation) >= 2.0f) {
|
||||
return PlayerIdle();
|
||||
}
|
||||
|
||||
return PlayerJabB();
|
||||
}
|
93
game/src/Player.h
Normal file
93
game/src/Player.h
Normal file
|
@ -0,0 +1,93 @@
|
|||
#ifndef FIGHT_PLAYER_H
|
||||
#define FIGHT_PLAYER_H
|
||||
|
||||
#include "state_machine.h"
|
||||
#include "state.h"
|
||||
#include "behaviour_entity.h"
|
||||
#include "animation_sprite.h"
|
||||
#include "input.h"
|
||||
#include "vmath.h"
|
||||
#include "transform.h"
|
||||
#include "player_input.h"
|
||||
|
||||
typedef struct Player {
|
||||
Transform transform;
|
||||
|
||||
PlayerInput* playerInput;
|
||||
|
||||
Vector moveInput;
|
||||
int attackInput;
|
||||
|
||||
Sprite* sprite;
|
||||
|
||||
AnimationSprite* idle;
|
||||
AnimationSprite* walk;
|
||||
AnimationSprite* jab_a;
|
||||
AnimationSprite* jab_b;
|
||||
|
||||
StateMachine* animationStateMachine;
|
||||
|
||||
AnimationSprite* currentAnimation;
|
||||
} Player;
|
||||
|
||||
Player* MakePlayer();
|
||||
Player* SpawnPlayer(Vector location);
|
||||
void DestroyPlayer(Player* self);
|
||||
|
||||
void PlayerHorizontalInput(Player* self, InputEvent value);
|
||||
void PlayerVerticalInput(Player* self, InputEvent value);
|
||||
void PlayerAttackInput(Player* self, InputEvent value);
|
||||
|
||||
void PlayerStart(Player* self);
|
||||
void PlayerUpdate(Player* self, float deltaTime);
|
||||
void PlayerDraw(Player* self);
|
||||
|
||||
impl_Drop_for(Player,
|
||||
DestroyPlayer
|
||||
)
|
||||
|
||||
impl_BehaviourEntity_for(Player,
|
||||
PlayerStart,
|
||||
PlayerUpdate,
|
||||
PlayerDraw
|
||||
)
|
||||
|
||||
void PlayerAnimationExit(Player* self);
|
||||
|
||||
void PlayerIdleEnter(Player* self);
|
||||
const State* PlayerIdleUpdate(Player* self, float deltaTime);
|
||||
|
||||
DefineState(PlayerIdle, Player,
|
||||
PlayerIdleEnter,
|
||||
PlayerIdleUpdate,
|
||||
PlayerAnimationExit
|
||||
)
|
||||
|
||||
void PlayerWalk_Enter(Player* self);
|
||||
const State* PlayerWalk_Update(Player* self, float deltaTime);
|
||||
|
||||
DefineState(PlayerWalk, Player,
|
||||
PlayerWalk_Enter,
|
||||
PlayerWalk_Update,
|
||||
PlayerAnimationExit
|
||||
)
|
||||
|
||||
void PlayerJabA_Enter(Player* self);
|
||||
const State* PlayerJabA_Update(Player* self, float deltaTime);
|
||||
|
||||
DefineState(PlayerJabA, Player,
|
||||
PlayerJabA_Enter,
|
||||
PlayerJabA_Update,
|
||||
PlayerAnimationExit
|
||||
)
|
||||
|
||||
void PlayerJabB_Enter(Player* self);
|
||||
const State* PlayerJabB_Update(Player* self, float deltaTime);
|
||||
|
||||
DefineState(PlayerJabB, Player,
|
||||
PlayerJabB_Enter,
|
||||
PlayerJabB_Update,
|
||||
PlayerAnimationExit
|
||||
)
|
||||
|
||||
#endif // !FIGHT_PLAYER_H
|
Loading…
Reference in a new issue