diff --git a/core/src/animation_sprite.c b/core/src/animation_sprite.c index 692721b..c66613a 100644 --- a/core/src/animation_sprite.c +++ b/core/src/animation_sprite.c @@ -4,7 +4,7 @@ struct AnimationSprite { Spritesheet* sheet; - Sprite* sprite; + Sprite* sprite_target; AnimationSpriteLoopMode loop_mode; @@ -12,22 +12,21 @@ struct AnimationSprite { float start_time; }; -AnimationSprite* animation_sprite_new(Spritesheet* sheet, float framerate) { +AnimationSprite* animation_sprite_new(Sprite* target_sprite, 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, + .loop_mode = LoopMode_Stop, .start_time = game_time(), - .sprite = sprite_from_spritesheet(sheet, 0) + .sprite_target = target_sprite }; return self; } void animation_sprite_destroy(AnimationSprite* self) { - sprite_destroy(self->sprite); spritesheet_destroy(self->sheet); free(self); } @@ -39,10 +38,9 @@ void animation_sprite_play_from(AnimationSprite* self, float normalized_time) { 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); + sprite_set_spritesheet(self->sprite_target, self->sheet); + sprite_set_tile(self->sprite_target, frame); + sprite_draw(self->sprite_target, *transform); } float animation_sprite_get_length(AnimationSprite* self) { @@ -56,3 +54,15 @@ void animation_sprite_set_framerate(AnimationSprite* self, float framerate) { float animation_sprite_get_framerate(const AnimationSprite* self) { return 1.0f / self->frame_interval; } + +Sprite* animation_sprite_get_sprite(AnimationSprite* self) { + return self->sprite_target; +} + +float animation_sprite_get_time(AnimationSprite* self) { + return game_time() - self->start_time; +} + +float animation_sprite_get_time_normalized(AnimationSprite* self) { + return animation_sprite_get_time(self) / animation_sprite_get_length(self); +} diff --git a/core/src/animation_sprite.h b/core/src/animation_sprite.h index 135e440..b59a2f5 100644 --- a/core/src/animation_sprite.h +++ b/core/src/animation_sprite.h @@ -13,7 +13,7 @@ typedef enum AnimationSpriteLoopMode { typedef struct AnimationSprite AnimationSprite; -extern AnimationSprite* animation_sprite_new(Spritesheet* sheet, float framerate); +extern AnimationSprite* animation_sprite_new(Sprite* target_sprite, Spritesheet* sheet, float framerate); extern void animation_sprite_destroy(AnimationSprite* self); extern void animation_sprite_play_from(AnimationSprite* self, float normalized_time); @@ -22,5 +22,8 @@ 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); +extern Sprite* animation_sprite_get_sprite(AnimationSprite* self); +extern float animation_sprite_get_time(AnimationSprite* self); +extern float animation_sprite_get_time_normalized(AnimationSprite* self); -#endif // !_fencer_animation_sprite_h \ No newline at end of file +#endif // !_fencer_animation_sprite_h