From 5aae7dd1a55453823f8d1d7307ce101c82aa2e82 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 22 Nov 2023 12:56:10 +0100 Subject: [PATCH] added player.c and started testing state machine for animation --- game/src/player.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++ game/src/player.h | 25 +++++++++++---- 2 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 game/src/player.c diff --git a/game/src/player.c b/game/src/player.c new file mode 100644 index 0000000..0994d31 --- /dev/null +++ b/game/src/player.c @@ -0,0 +1,77 @@ +#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, + .animationStateMachine = state_machine_init(self, PlayerIdle()), + .sprite = sprite_from_spritesheet(walk, 0), + .stand = idle, + .walk = walk, + .animFrameInterval = 1.0f/8.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) {} + +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) { + size_t nextFrame = sprite_get_tile(self->sprite) + 1; + sprite_set_tile(self->sprite, nextFrame); + + if (nextFrame > spritesheet_get_tile_count(sprite_get_spritesheet(self->sprite))) { + return PlayerIdle(); // TODO! + } + } + + return state_machine_get_current_state(self->animationStateMachine); +} + +void PlayerAnimationExit(Player* self) {} + +void PlayerIdleEnter(Player* self) { + self->sprite = sprite_from_spritesheet(self->stand, 0); +} diff --git a/game/src/player.h b/game/src/player.h index a029094..4e23ac5 100644 --- a/game/src/player.h +++ b/game/src/player.h @@ -12,7 +12,9 @@ typedef struct Player { Transform transform; - StateMachine* animationState; + StateMachine* animationStateMachine; + float animFrameTimer; + float animFrameInterval; Spritesheet* walk; Spritesheet* stand; @@ -22,7 +24,7 @@ typedef struct Player { extern Player* MakePlayer(); -extern void SpawnPlayer(Player* self, Vector location); +extern Player* SpawnPlayer(Vector location); extern void PlayerUpdate(Player* self, float deltaTime); extern void PlayerStart(Player* self); extern void PlayerDestroy(Player* self); @@ -35,6 +37,10 @@ impl_Drop_for(Player, PlayerDestroy ) +impl_Transformable_for(Player, + PlayerGetTransform +) + impl_BehaviourEntity_for(Player, PlayerStart, PlayerUpdate, @@ -42,12 +48,19 @@ impl_BehaviourEntity_for(Player, PlayerDraw ) -impl_Transformable_for(Player, - PlayerGetTransform -) - impl_SpriteEntity_for(Player, PlayerGetSprite ) +extern const State* PlayerAnimationUpdate(Player* player, float deltaTime); +extern void PlayerAnimationExit(Player* player); + +extern void PlayerIdleEnter(Player* player); + +DefineState(PlayerIdle, + PlayerIdleEnter, + PlayerAnimationExit, + PlayerAnimationUpdate +) + #endif // !TOPDOWN_PLAYER_H