#include "player.h" #include "debug.h" #include "game_world.h" static inline void InternalPlayerInitInput(Player* self) { // HORIZONTAL playerinput_add(self->input, CompositeAxis1D_as_InputAxis(compositeaxis1d_new( KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_A)), KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_D)), InputEvent_Float )), (InputDelegateFn)PlayerInputHorizontal); // VERTICAL playerinput_add(self->input, CompositeAxis1D_as_InputAxis(compositeaxis1d_new( KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_S)), KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_W)), InputEvent_Float )), (InputDelegateFn)PlayerInputVertical); } Player* MakePlayer() { Player* self = malloc(sizeof(Player)); ASSERT_RETURN(self != NULL, NULL, "Could not allocate enough space for Player instance"); Spritesheet* walk = spritesheet_load("assets/sprites/player/player_walk.png", IVectorFrom(512)); Spritesheet* idle = spritesheet_load("assets/sprites/player/player_walk.png", IVectorFrom(512)); *self = (Player){ .transform = IdentityTransform, .input = playerinput_new(self, -1), .input_direction = ZeroVector, .faceDirection = 0, .animationStateMachine = state_machine_init(self, PlayerIdle()), .animFrame = 0, .animFrameInterval = 1.0f / 4.0f, .animFrameTimer = 0.0f, .stand = idle, .walk = walk, .sprite = sprite_from_spritesheet(walk, 0), }; return self; } Player* SpawnPlayer(Vector location) { Player* self = MakePlayer(); self->transform.position = location; game_world_add_entity(Player_as_BehaviourEntity(self)); return self; } void PlayerStart(Player* self) {} void PlayerUpdate(Player* self, float deltaTime) { state_machine_update(self->animationStateMachine, deltaTime); } void PlayerDestroy(Player* self) { state_machine_destroy(self->animationStateMachine); spritesheet_destroy(self->walk); spritesheet_destroy(self->stand); sprite_destroy(self->sprite); } void PlayerDraw(Player* self) { sprite_entity_draw(Player_as_SpriteEntity(self)); } void PlayerInputHorizontal(Player* self, InputEvent event) {} void PlayerInputVertical(Player* self, InputEvent event) {} Sprite* PlayerGetSprite(Player* self) { return self->sprite; } Transform* PlayerGetTransform(Player* self) { return &self->transform; } const State* PlayerAnimationUpdate(Player* self, float deltaTime) { self->animFrameTimer += deltaTime; if (self->animFrameTimer > self->animFrameInterval) { self->animFrameTimer = 0.f; ++self->animFrame; size_t nextFrame = self->animFrame * 8 + self->faceDirection; sprite_set_tile(self->sprite, nextFrame); if (nextFrame > spritesheet_get_tile_count(sprite_get_spritesheet(self->sprite))) { return PlayerIdle(); } } return state_machine_get_current_state(self->animationStateMachine); } void PlayerAnimationExit(Player* self) {} void PlayerIdleEnter(Player* self) { self->sprite = sprite_from_spritesheet(self->stand, 0); }