From bfb354a3cf1a51651da8d74220a6db0b98c9fd1d Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 12 Nov 2023 14:00:20 +0100 Subject: [PATCH] implemented animation and sprite flipping --- src/sprite.c | 36 +++++++++++++++++++++++++++++++----- src/sprite.h | 3 +++ src/spritesheet.c | 4 ++++ src/spritesheet.h | 1 + 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/sprite.c b/src/sprite.c index 09b3d80..ac86bd8 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -15,6 +15,8 @@ struct Sprite { // The local transformation of this sprite. Vector origin; + + SDL_RendererFlip flip_state; }; Sprite* sprite_from_spritesheet(Spritesheet* sheet, size_t initial_frame) { @@ -25,6 +27,7 @@ Sprite* sprite_from_spritesheet(Spritesheet* sheet, size_t initial_frame) { self->spritesheet = sheet; self->origin = (Vector){0.5f, 0.5f}; self->tile_index = initial_frame; + self->flip_state = SDL_FLIP_NONE; return self; } @@ -34,22 +37,28 @@ void sprite_destroy(Sprite* 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_tile_rect(self->spritesheet, self->tile_index); - Vector left_top = transform_point(&transform, vinvf(self->origin)); + Vector origin = self->origin; + if(self->flip_state && SDL_FLIP_HORIZONTAL) { + origin.x = 1.0-origin.x; + } + if((self->flip_state & SDL_FLIP_VERTICAL) != 0) { + origin.y = 1.0-origin.y; + } + Vector left_top = transform_point(&transform, vinvf(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); + + origin = vmulf(origin, transform.scale); SDL_RenderCopyExF(g_renderer, texture, &source, &destination, - transform.rotation * 57.2958, &origin, SDL_FLIP_NONE); + transform.rotation * 57.2958, &origin, self->flip_state); SDL_SetRenderDrawColor(g_renderer, 255, 255, 255, 255); } @@ -66,6 +75,7 @@ size_t sprite_get_tile(const Sprite* self) { } void sprite_set_tile(Sprite* self, size_t frame) { + frame = frame % spritesheet_get_tile_count(self->spritesheet); self->tile_index = frame; } @@ -76,3 +86,19 @@ Spritesheet* sprite_get_spritesheet(const Sprite* self) { void sprite_set_spritesheet(Sprite* self, Spritesheet* spritesheet) { self->spritesheet = spritesheet; } + +void sprite_flip_horizontal(Sprite* self, int horizontal) { + if(horizontal) { + self->flip_state |= SDL_FLIP_HORIZONTAL; + } else { + self->flip_state &= ~SDL_FLIP_HORIZONTAL; + } +} + +void sprite_flip_vertical(Sprite* self, int vertical) { + if(vertical) { + self->flip_state |= SDL_FLIP_VERTICAL; + } else { + self->flip_state &= ~SDL_FLIP_VERTICAL; + } +} diff --git a/src/sprite.h b/src/sprite.h index ddc1da4..8fdf0ac 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -24,4 +24,7 @@ extern void sprite_set_tile(Sprite* self, size_t tile); extern Spritesheet* sprite_get_spritesheet(const Sprite* self); extern void sprite_set_spritesheet(Sprite* self, Spritesheet* spritesheet); +extern void sprite_flip_horizontal(Sprite* self, int horizontal); +extern void sprite_flip_vertical(Sprite* self, int vertical); + #endif // !_fencer_sprite_h diff --git a/src/spritesheet.c b/src/spritesheet.c index 3dede77..454dcc9 100644 --- a/src/spritesheet.c +++ b/src/spritesheet.c @@ -71,6 +71,10 @@ IVector spritesheet_get_resolution(const Spritesheet* self) { return self->resolution; } +size_t spritesheet_get_tile_count(const Spritesheet* self) { + return self->tile_count; +} + asset_id spritesheet_get_asset_id(Spritesheet* self) { return self->asset_id; } diff --git a/src/spritesheet.h b/src/spritesheet.h index 54d094e..8d76e38 100644 --- a/src/spritesheet.h +++ b/src/spritesheet.h @@ -14,6 +14,7 @@ extern void spritesheet_destroy(Spritesheet* self); extern SDL_Texture* spritesheet_get_texture(const Spritesheet* self); extern SDL_Rect spritesheet_get_tile_rect(const Spritesheet* self, size_t index); extern IVector spritesheet_get_resolution(const Spritesheet* self); +extern size_t spritesheet_get_tile_count(const Spritesheet* self); extern asset_id spritesheet_get_asset_id(Spritesheet* self); extern void spritesheet_set_asset_id(Spritesheet* self, asset_id id);