feat(animation): AnimationSprite no longer owns it's target sprite and has more time functions
This commit is contained in:
parent
adaa01ae4b
commit
1ee59154fc
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
struct AnimationSprite {
|
struct AnimationSprite {
|
||||||
Spritesheet* sheet;
|
Spritesheet* sheet;
|
||||||
Sprite* sprite;
|
Sprite* sprite_target;
|
||||||
|
|
||||||
AnimationSpriteLoopMode loop_mode;
|
AnimationSpriteLoopMode loop_mode;
|
||||||
|
|
||||||
|
@ -12,22 +12,21 @@ struct AnimationSprite {
|
||||||
float start_time;
|
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));
|
AnimationSprite* self = malloc(sizeof(AnimationSprite));
|
||||||
ASSERT_RETURN(self != NULL, NULL, "Failed to allocate memory for AnimationSprite");
|
ASSERT_RETURN(self != NULL, NULL, "Failed to allocate memory for AnimationSprite");
|
||||||
*self = (AnimationSprite){
|
*self = (AnimationSprite){
|
||||||
.sheet = sheet,
|
.sheet = sheet,
|
||||||
.frame_interval = 1.0f / framerate,
|
.frame_interval = 1.0f / framerate,
|
||||||
.loop_mode = LoopMode_Loop,
|
.loop_mode = LoopMode_Stop,
|
||||||
.start_time = game_time(),
|
.start_time = game_time(),
|
||||||
.sprite = sprite_from_spritesheet(sheet, 0)
|
.sprite_target = target_sprite
|
||||||
};
|
};
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
void animation_sprite_destroy(AnimationSprite* self) {
|
void animation_sprite_destroy(AnimationSprite* self) {
|
||||||
sprite_destroy(self->sprite);
|
|
||||||
spritesheet_destroy(self->sheet);
|
spritesheet_destroy(self->sheet);
|
||||||
free(self);
|
free(self);
|
||||||
}
|
}
|
||||||
|
@ -39,10 +38,9 @@ void animation_sprite_play_from(AnimationSprite* self, float normalized_time) {
|
||||||
void animation_sprite_draw(AnimationSprite* self, Transform* transform) {
|
void animation_sprite_draw(AnimationSprite* self, Transform* transform) {
|
||||||
const float time = game_time() - self->start_time;
|
const float time = game_time() - self->start_time;
|
||||||
const size_t frame = time / self->frame_interval;
|
const size_t frame = time / self->frame_interval;
|
||||||
|
sprite_set_spritesheet(self->sprite_target, self->sheet);
|
||||||
sprite_set_spritesheet(self->sprite, self->sheet);
|
sprite_set_tile(self->sprite_target, frame);
|
||||||
sprite_set_tile(self->sprite, frame);
|
sprite_draw(self->sprite_target, *transform);
|
||||||
sprite_draw(self->sprite, *transform);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float animation_sprite_get_length(AnimationSprite* self) {
|
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) {
|
float animation_sprite_get_framerate(const AnimationSprite* self) {
|
||||||
return 1.0f / self->frame_interval;
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ typedef enum AnimationSpriteLoopMode {
|
||||||
|
|
||||||
typedef struct AnimationSprite AnimationSprite;
|
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_destroy(AnimationSprite* self);
|
||||||
|
|
||||||
extern void animation_sprite_play_from(AnimationSprite* self, float normalized_time);
|
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 float animation_sprite_get_length(AnimationSprite* self);
|
||||||
extern void animation_sprite_set_framerate(AnimationSprite* self, float framerate);
|
extern void animation_sprite_set_framerate(AnimationSprite* self, float framerate);
|
||||||
extern float animation_sprite_get_framerate(const AnimationSprite* self);
|
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
|
#endif // !_fencer_animation_sprite_h
|
Loading…
Reference in a new issue