#include "sprite.h" #include "camera.h" #include "debug.h" #include "render.h" #include "spritesheet.h" #include #include struct Sprite { // The animation sheet to sample sprites from. Spritesheet* spritesheet; // The current frame of animation. size_t current_frame; // Time at the start of the current frame of animation. float current_frame_time; // The local transformation of this sprite. Vector origin; }; Sprite* sprite_from_spritesheet(Spritesheet* sheet, size_t initial_frame) { Sprite* self = malloc(sizeof(Sprite)); ASSERT_RETURN(self != NULL, NULL, "Failed to allocate memory for new sprite."); self->spritesheet = sheet; self->origin = (Vector){0.5f, 1.0f}; self->current_frame = initial_frame; // TODO: replace with a getter for the current game time. self->current_frame_time = 0; return self; } void sprite_destroy(Sprite* self) { free(self); } void sprite_draw(Sprite* self, Transform transform) { SDL_Texture* texture = spritesheet_get_texture(self->spritesheet); SDL_Rect source = spritesheet_get_frame_rect(self->spritesheet, self->current_frame); Vector left_top = transform_point(&transform, vinvf(self->origin)); SDL_FRect destination = (SDL_FRect) { left_top.x, left_top.y, transform.scale.x, transform.scale.y }; destination = camera_world_to_pixel_rect(&g_camera, &destination); Vector origin = vmulf(self->origin, transform.scale); SDL_RenderCopyExF(g_renderer, texture, &source, &destination, transform.rotation * 57.2958, &origin, SDL_FLIP_NONE); SDL_SetRenderDrawColor(g_renderer, 255, 255, 255, 255); } Vector sprite_get_origin(Sprite* self) { return self->origin; } void sprite_set_origin(Sprite* self, Vector origin) { self->origin = origin; } size_t sprite_get_frame(const Sprite* self) { return self->current_frame; } void sprite_set_frame(Sprite* self, size_t size) { self->current_frame = size; } Spritesheet* sprite_get_spritesheet(const Sprite* self) { return self->spritesheet; } void sprite_set_spritesheet(Sprite* self, Spritesheet* spritesheet) { self->spritesheet = spritesheet; }