From b1a6430eb720e3c9f276787e8db4f761d55f24f4 Mon Sep 17 00:00:00 2001 From: En Yi Date: Tue, 23 May 2023 21:33:05 +0800 Subject: [PATCH] Add horizontal flip to sprites --- assets_test.c | 4 ++-- scenes/editor_scene.c | 4 ++-- scenes/engine/EC/EC.h | 4 ++-- scenes/engine/assets.c | 4 ++-- scenes/engine/assets.h | 2 +- scenes/player_ent.c | 3 +++ 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/assets_test.c b/assets_test.c index 5a2480d..9b67f89 100644 --- a/assets_test.c +++ b/assets_test.c @@ -43,8 +43,8 @@ int main(void) DrawTextEx(*fnt, "Press C to play a sound", (Vector2){64, 64}, 24, 1, RED); // Draw the static Sprite and animated Sprite - draw_sprite(spr, (Vector2){64,128}); - draw_sprite(spr2, (Vector2){64,180}); + draw_sprite(spr, (Vector2){64,128}, false); + draw_sprite(spr2, (Vector2){64,180}, true); EndDrawing(); // Update the animated Sprite diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index d57090a..2b276a3 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -53,7 +53,7 @@ static void level_scene_render_func(Scene_t* scene) if (data->tile_sprites[tilemap.tiles[i].tile_type] != NULL) { - draw_sprite(data->tile_sprites[tilemap.tiles[i].tile_type], (Vector2){x,y}); + draw_sprite(data->tile_sprites[tilemap.tiles[i].tile_type], (Vector2){x,y}, false); } else if (tilemap.tiles[i].tile_type == SOLID_TILE) { @@ -126,7 +126,7 @@ static void level_scene_render_func(Scene_t* scene) if (spr.sprite != NULL) { Vector2 pos = Vector2Add(p_ct->position, spr.offset); - draw_sprite(spr.sprite, pos); + draw_sprite(spr.sprite, pos, p_cspr->flip_x); } } } diff --git a/scenes/engine/EC/EC.h b/scenes/engine/EC/EC.h index a43ea03..d35299b 100644 --- a/scenes/engine/EC/EC.h +++ b/scenes/engine/EC/EC.h @@ -124,14 +124,14 @@ typedef struct _SpriteRenderInfo { Sprite_t* sprite; Vector2 offset; - bool flip_x; - bool flip_y; } SpriteRenderInfo_t; typedef struct _CSprite_t { SpriteRenderInfo_t* sprites; sprite_transition_func_t transition_func; unsigned int current_idx; + bool flip_x; + bool flip_y; } CSprite_t; static inline void set_bbox(CBBox_t* p_bbox, unsigned int x, unsigned int y) diff --git a/scenes/engine/assets.c b/scenes/engine/assets.c index 1aca17c..8441fc0 100644 --- a/scenes/engine/assets.c +++ b/scenes/engine/assets.c @@ -151,12 +151,12 @@ Font* get_font(Assets_t* assets, const char* name) return NULL; } -void draw_sprite(Sprite_t* spr, Vector2 pos) +void draw_sprite(Sprite_t* spr, Vector2 pos, bool flip_x) { Rectangle rec = { spr->origin.x + spr->frame_size.x * spr->current_frame, spr->origin.y, - spr->frame_size.x, + spr->frame_size.x * (flip_x ? -1:1), spr->frame_size.y }; DrawTextureRec(*spr->texture, rec, pos, WHITE); diff --git a/scenes/engine/assets.h b/scenes/engine/assets.h index 031732f..278b628 100644 --- a/scenes/engine/assets.h +++ b/scenes/engine/assets.h @@ -28,5 +28,5 @@ Sprite_t* get_sprite(Assets_t* assets, const char* name); Sound* get_sound(Assets_t* assets, const char* name); Font* get_font(Assets_t* assets, const char* name); -void draw_sprite(Sprite_t* spr, Vector2 pos); +void draw_sprite(Sprite_t* spr, Vector2 pos, bool flip_x); #endif // __ASSETS_H diff --git a/scenes/player_ent.c b/scenes/player_ent.c index 043b943..5272075 100644 --- a/scenes/player_ent.c +++ b/scenes/player_ent.c @@ -16,6 +16,9 @@ static SpriteRenderInfo_t player_sprite_map[N_PLAYER_SPRITES] = {0}; static unsigned int player_sprite_transition_func(Entity_t* ent) { CTransform_t* p_ctrans = get_component(ent, CTRANSFORM_COMP_T); + CSprite_t* p_spr = get_component(ent, CSPRITE_T); + if (p_ctrans->velocity.x > 0) p_spr->flip_x = true; + else if (p_ctrans->velocity.x < 0) p_spr->flip_x = false; if (Vector2LengthSqr(p_ctrans->velocity) > 10000.0f) { return SPR_PLAYER_RUN;