Files
major_tom/src/engine/animation.c
2026-02-28 18:03:47 +00:00

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;
}