#include #include #include #include "animation.h" #include const SDL_Rect* current_frame(const struct animation* animation) { return &animation->frames[animation->current_frame]; } void init_animation(struct animation* animation, struct animation_init* init) { int initial_frame_count = init->initial_frame_count; if (initial_frame_count <= 0) { fprintf(stderr, "All animations need to have at least 1 frame!\n"); exit(1); } if(init->spritesheet_texture == NULL) { animation->texture = IMG_LoadTexture(init->ren, init->spritesheet); } else { animation->texture = init->spritesheet_texture; } if(animation->texture == NULL) { printf("Failed to load spritesheet %s, error: %s, exitting!\n", init->spritesheet, IMG_GetError()); exit(1); } animation->num_frames = initial_frame_count; int size = initial_frame_count * sizeof(float); animation->frame_times = malloc(size); memcpy(animation->frame_times, init->initial_frame_times, size); size = initial_frame_count * sizeof(SDL_Rect); animation->frames = malloc(size); memcpy(animation->frames, init->initial_frames, size); animation->angle = init->initial_angle; } void update_animation(struct animation* animation, float dt) { int frame_index = animation->current_frame; float current_frame_time = animation->frame_times[frame_index]; animation->current_time += dt; if(animation->current_time >= current_frame_time) { animation->current_time = 0; animation->current_frame = (frame_index + 1) % animation->num_frames; } } void draw_animation(struct demo* demo, const struct animation* animation, const SDL_Rect* d_rect) { const SDL_Rect* s_rect = current_frame(animation); demo_rendercopy_ex(demo, animation->texture, s_rect, d_rect, animation->angle, NULL, SDL_FLIP_NONE); } void reset_animation(struct animation* animation) { animation->current_frame = 0; animation->current_time = 0; }