#include "player.h" #include "debug.h" #include "game_world.h" 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, .faceDirection = 0, .animationStateMachine = state_machine_init(self, PlayerIdle()), .animFrame = 0, .sprite = sprite_from_spritesheet(walk, 0), .stand = idle, .walk = walk, .animFrameInterval = 1.0f/4.0f, .animFrameTimer = 0.0f, }; 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)); } 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; size_t nextFrame = self->animFrame + 8; 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); }