added player.c and started testing state machine for animation
This commit is contained in:
parent
2032488149
commit
5aae7dd1a5
77
game/src/player.c
Normal file
77
game/src/player.c
Normal 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);
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue