added player.c and started testing state machine for animation

This commit is contained in:
Sara 2023-11-22 12:56:10 +01:00 committed by Scott-G-GD
parent 2032488149
commit 5aae7dd1a5
2 changed files with 96 additions and 6 deletions

77
game/src/player.c Normal file
View file

@ -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);
}

View file

@ -12,7 +12,9 @@
typedef struct Player { typedef struct Player {
Transform transform; Transform transform;
StateMachine* animationState; StateMachine* animationStateMachine;
float animFrameTimer;
float animFrameInterval;
Spritesheet* walk; Spritesheet* walk;
Spritesheet* stand; Spritesheet* stand;
@ -22,7 +24,7 @@ typedef struct Player {
extern Player* MakePlayer(); extern Player* MakePlayer();
extern void SpawnPlayer(Player* self, Vector location); extern Player* SpawnPlayer(Vector location);
extern void PlayerUpdate(Player* self, float deltaTime); extern void PlayerUpdate(Player* self, float deltaTime);
extern void PlayerStart(Player* self); extern void PlayerStart(Player* self);
extern void PlayerDestroy(Player* self); extern void PlayerDestroy(Player* self);
@ -35,6 +37,10 @@ impl_Drop_for(Player,
PlayerDestroy PlayerDestroy
) )
impl_Transformable_for(Player,
PlayerGetTransform
)
impl_BehaviourEntity_for(Player, impl_BehaviourEntity_for(Player,
PlayerStart, PlayerStart,
PlayerUpdate, PlayerUpdate,
@ -42,12 +48,19 @@ impl_BehaviourEntity_for(Player,
PlayerDraw PlayerDraw
) )
impl_Transformable_for(Player,
PlayerGetTransform
)
impl_SpriteEntity_for(Player, impl_SpriteEntity_for(Player,
PlayerGetSprite 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 #endif // !TOPDOWN_PLAYER_H