50 lines
1.4 KiB
C
50 lines
1.4 KiB
C
#include "engine/animation.h"
|
|
|
|
void animation_set(Animation *a, const AnimDef *def) {
|
|
if (a->def == def) return; /* don't restart same anim */
|
|
a->def = def;
|
|
a->current_frame = 0;
|
|
a->timer = 0.0f;
|
|
a->finished = false;
|
|
}
|
|
|
|
void animation_update(Animation *a, float dt) {
|
|
if (!a->def || a->finished) return;
|
|
|
|
a->timer += dt;
|
|
while (a->timer >= a->def->frames[a->current_frame].duration) {
|
|
float dur = a->def->frames[a->current_frame].duration;
|
|
if (dur <= 0.0f) break; /* avoid infinite loop on zero-duration frames */
|
|
a->timer -= dur;
|
|
a->current_frame++;
|
|
|
|
if (a->current_frame >= a->def->frame_count) {
|
|
if (a->def->looping) {
|
|
a->current_frame = 0;
|
|
} else {
|
|
a->current_frame = a->def->frame_count - 1;
|
|
a->finished = true;
|
|
a->timer = 0.0f;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SDL_Rect animation_current_rect(const Animation *a) {
|
|
if (!a->def || a->def->frame_count == 0) {
|
|
return (SDL_Rect){0, 0, 0, 0};
|
|
}
|
|
return a->def->frames[a->current_frame].src;
|
|
}
|
|
|
|
bool animation_is_last_frame(const Animation *a) {
|
|
if (!a->def) return true;
|
|
return a->current_frame >= a->def->frame_count - 1;
|
|
}
|
|
|
|
SDL_Texture *animation_texture(const Animation *a) {
|
|
if (!a->def) return NULL;
|
|
return a->def->texture;
|
|
}
|