60 lines
1.8 KiB
C
60 lines
1.8 KiB
C
#include "sprite.h"
|
|
#include "camera.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* sheet;
|
|
|
|
// 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.
|
|
Transform transform;
|
|
Vector origin;
|
|
};
|
|
|
|
Sprite* sprite_from_spritesheet(Spritesheet* sheet) {
|
|
Sprite* self = malloc(sizeof(Sprite));
|
|
|
|
self->sheet = sheet;
|
|
self->transform = IdentityTransform;
|
|
self->origin = (Vector){0.5f, 1.0f};
|
|
self->current_frame = 0;
|
|
// 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->sheet);
|
|
SDL_Rect source = spritesheet_get_frame_rect(self->sheet, self->current_frame);
|
|
transform = transform_apply(transform, self->transform);
|
|
Vector left_top = vinvf(transform_point(&transform, self->origin));
|
|
printf("lt: %f %f\n", left_top.x, left_top.y);
|
|
printf("or: %f %f\n", self->origin.x, self->origin.y);
|
|
|
|
SDL_FRect destination = (SDL_FRect) {
|
|
left_top.x, left_top.y,
|
|
transform.scale.x, transform.scale.y
|
|
};
|
|
|
|
destination = camera_world_to_screen_space(&g_camera, &destination);
|
|
|
|
Vector origin = vmulf(self->origin, vmulff(transform.scale, 0.5f));
|
|
self->transform.rotation += 0.01f;
|
|
|
|
SDL_RenderCopyExF(g_renderer, texture, &source, &destination,
|
|
transform.rotation * 57.2958, &origin, SDL_FLIP_NONE);
|
|
}
|