diff --git a/core/src/animation_sprite.c b/core/src/animation_sprite.c new file mode 100644 index 0000000..53f972b --- /dev/null +++ b/core/src/animation_sprite.c @@ -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; +} diff --git a/core/src/animation_sprite.h b/core/src/animation_sprite.h new file mode 100644 index 0000000..135e440 --- /dev/null +++ b/core/src/animation_sprite.h @@ -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 \ No newline at end of file