feat(animation): added AnimationSprite to manage an animated sprite
This commit is contained in:
parent
1ffbd74a08
commit
3e0490d5bf
57
core/src/animation_sprite.c
Normal file
57
core/src/animation_sprite.c
Normal file
|
@ -0,0 +1,57 @@
|
|||
#include "animation_sprite.h"
|
||||
#include "debug.h"
|
||||
#include "program.h"
|
||||
|
||||
struct AnimationSprite {
|
||||
Spritesheet* sheet;
|
||||
Sprite* sprite;
|
||||
|
||||
AnimationSpriteLoopMode loop_mode;
|
||||
|
||||
float frame_interval;
|
||||
float start_time;
|
||||
|
||||
};
|
||||
|
||||
AnimationSprite* animation_sprite_new(Spritesheet* sheet, float framerate) {
|
||||
AnimationSprite* self = malloc(sizeof(AnimationSprite));
|
||||
ASSERT_RETURN(self != NULL, NULL, "Failed to allocate memory for AnimationSprite");
|
||||
*self = (AnimationSprite){
|
||||
.sheet = sheet,
|
||||
.frame_interval = 1.0f / framerate,
|
||||
.loop_mode = LoopMode_Loop,
|
||||
.start_time = game_time(),
|
||||
.sprite = sprite_from_spritesheet(sheet, 0)
|
||||
};
|
||||
}
|
||||
|
||||
void animation_sprite_destroy(AnimationSprite* self) {
|
||||
sprite_destroy(self->sprite);
|
||||
spritesheet_destroy(self->sheet);
|
||||
free(self);
|
||||
}
|
||||
|
||||
void animation_sprite_play_from(AnimationSprite* self, float normalized_time) {
|
||||
self->start_time = game_time() - normalized_time * animation_sprite_get_length(self);
|
||||
}
|
||||
|
||||
void animation_sprite_draw(AnimationSprite* self, Transform* transform) {
|
||||
const float time = game_time() - self->start_time;
|
||||
const size_t frame = time / self->frame_interval;
|
||||
|
||||
sprite_set_spritesheet(self->sprite, self->sheet);
|
||||
sprite_set_tile(self->sprite, frame);
|
||||
sprite_draw(self->sprite, *transform);
|
||||
}
|
||||
|
||||
float animation_sprite_get_length(AnimationSprite* self) {
|
||||
return (float)spritesheet_get_tile_count(self->sheet) * self->frame_interval;
|
||||
}
|
||||
|
||||
void animation_sprite_set_framerate(AnimationSprite* self, float framerate) {
|
||||
self->frame_interval = 1.0f / framerate;
|
||||
}
|
||||
|
||||
float animation_sprite_get_framerate(AnimationSprite* self) {
|
||||
return 1.0f / self->frame_interval;
|
||||
}
|
26
core/src/animation_sprite.h
Normal file
26
core/src/animation_sprite.h
Normal file
|
@ -0,0 +1,26 @@
|
|||
#ifndef _fencer_animation_sprite_h
|
||||
#define _fencer_animation_sprite_h
|
||||
|
||||
#include "sprite.h"
|
||||
#include "spritesheet.h"
|
||||
|
||||
typedef enum AnimationSpriteLoopMode {
|
||||
LoopMode_Stop,
|
||||
LoopMode_Hide,
|
||||
LoopMode_Loop,
|
||||
LoopMode_PingPong,
|
||||
} AnimationSpriteLoopMode;
|
||||
|
||||
typedef struct AnimationSprite AnimationSprite;
|
||||
|
||||
extern AnimationSprite* animation_sprite_new(Spritesheet* sheet, float framerate);
|
||||
extern void animation_sprite_destroy(AnimationSprite* self);
|
||||
|
||||
extern void animation_sprite_play_from(AnimationSprite* self, float normalized_time);
|
||||
extern void animation_sprite_draw(AnimationSprite* self, Transform* transform);
|
||||
|
||||
extern float animation_sprite_get_length(AnimationSprite* self);
|
||||
extern void animation_sprite_set_framerate(AnimationSprite* self, float framerate);
|
||||
extern float animation_sprite_get_framerate(const AnimationSprite* self);
|
||||
|
||||
#endif // !_fencer_animation_sprite_h
|
Loading…
Reference in a new issue