83 lines
2.1 KiB
C
83 lines
2.1 KiB
C
#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);
|
|
}
|