fencer/src/sprite.c
2023-10-19 18:04:27 +02:00

82 lines
2.3 KiB
C

#include "sprite.h"
#include "camera.h"
#include "debug.h"
#include "render.h"
#include "spritesheet.h"
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_render.h>
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, 0.5f};
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) {
// #warning "sprite drawing disabled"
// return;
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;
}