From 0c540d5053f42faaea30081445761cde07fe7adf Mon Sep 17 00:00:00 2001 From: En Yi Date: Sat, 4 Nov 2023 20:32:29 +0800 Subject: [PATCH] Move frame counter out of sprite component This allows individual animation --- assets_test.c | 9 +++++---- engine/EC.h | 2 +- engine/assets.c | 4 ++-- engine/assets.h | 2 +- engine/particle_sys.c | 2 +- particle_test.c | 1 - scenes/editor_scene.c | 4 ++-- scenes/game_scene.c | 4 ++-- scenes/game_systems.c | 6 +++--- water_test.c | 2 +- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/assets_test.c b/assets_test.c index 0ee0e68..24124c8 100644 --- a/assets_test.c +++ b/assets_test.c @@ -31,6 +31,7 @@ int main(void) add_font(&assets, "testfont", "res/test_font.ttf"); Font* fnt = get_font(&assets, "testfont"); + int current_frame = 0; while(!WindowShouldClose()) { if (IsKeyReleased(KEY_C)) @@ -43,16 +44,16 @@ 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}, 0.0f, false); - draw_sprite(spr2, (Vector2){64,180}, 0.0f, true); + draw_sprite(spr, 0, (Vector2){64,128}, 0.0f, false); + draw_sprite(spr2, current_frame, (Vector2){64,180}, 0.0f, true); EndDrawing(); // Update the animated Sprite spr2->elapsed++; if (spr2->elapsed == spr2->speed) { - spr2->current_frame++; - spr2->current_frame %= spr2->frame_count; + current_frame++; + current_frame %= spr2->frame_count; spr2->elapsed = 0; } } diff --git a/engine/EC.h b/engine/EC.h index ffc2168..0cb94ea 100644 --- a/engine/EC.h +++ b/engine/EC.h @@ -185,7 +185,6 @@ typedef struct Sprite { Vector2 origin; Vector2 anchor; int frame_count; - int current_frame; int elapsed; int speed; char* name; @@ -205,6 +204,7 @@ typedef struct _CSprite_t { bool flip_x; bool flip_y; bool pause; + int current_frame; } CSprite_t; typedef struct _CMoveable_t { diff --git a/engine/assets.c b/engine/assets.c index 462ed34..19ca3f9 100644 --- a/engine/assets.c +++ b/engine/assets.c @@ -461,10 +461,10 @@ LevelPack_t* get_level_pack(Assets_t* assets, const char* name) return NULL; } -void draw_sprite(Sprite_t* spr, Vector2 pos, float rotation, bool flip_x) +void draw_sprite(Sprite_t* spr, int frame_num, Vector2 pos, float rotation, bool flip_x) { Rectangle rec = { - spr->origin.x + spr->frame_size.x * spr->current_frame, + spr->origin.x + spr->frame_size.x * frame_num, spr->origin.y, spr->frame_size.x * (flip_x ? -1:1), spr->frame_size.y diff --git a/engine/assets.h b/engine/assets.h index acc4b01..7e5747b 100644 --- a/engine/assets.h +++ b/engine/assets.h @@ -68,7 +68,7 @@ Sound* get_sound(Assets_t* assets, const char* name); Font* get_font(Assets_t* assets, const char* name); LevelPack_t* get_level_pack(Assets_t* assets, const char* name); -void draw_sprite(Sprite_t* spr, Vector2 pos, float rotation, bool flip_x); +void draw_sprite(Sprite_t* spr, int frame_num, Vector2 pos, float rotation, bool flip_x); typedef struct SFX { diff --git a/engine/particle_sys.c b/engine/particle_sys.c index 3b7154b..fbaecc6 100644 --- a/engine/particle_sys.c +++ b/engine/particle_sys.c @@ -137,7 +137,7 @@ void draw_particle_system(ParticleSystem_t* system) } else { - draw_sprite(emitter->spr, part->position, part->rotation, false); + draw_sprite(emitter->spr, 0, part->position, part->rotation, false); } } } diff --git a/particle_test.c b/particle_test.c index 55246c5..7cb37fe 100644 --- a/particle_test.c +++ b/particle_test.c @@ -58,7 +58,6 @@ int main(void) .origin = (Vector2){0, 0}, .anchor = (Vector2){tex.width / 2, tex.height / 2}, .frame_count = 0, - .current_frame = 0, .elapsed = 0, .speed = 0, .name = "test_spr" diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index 2106165..fc6a353 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -225,7 +225,7 @@ static void render_editor_game_scene(Scene_t* scene) uint8_t tile_sprite_idx = tilemap.tiles[i].tile_type + tilemap.tiles[i].rotation; if (data->tile_sprites[tile_sprite_idx] != NULL) { - draw_sprite(data->tile_sprites[tile_sprite_idx], (Vector2){x,y}, 0.0f, false); + draw_sprite(data->tile_sprites[tile_sprite_idx], 0, (Vector2){x,y}, 0.0f, false); } else if (tilemap.tiles[i].tile_type == SOLID_TILE) { @@ -429,7 +429,7 @@ static void render_editor_game_scene(Scene_t* scene) if (spr.sprite != NULL) { Vector2 pos = Vector2Add(p_ct->position, spr.offset); - draw_sprite(spr.sprite, pos, 0.0f, p_cspr->flip_x); + draw_sprite(spr.sprite, p_cspr->current_frame, pos, 0.0f, p_cspr->flip_x); } } } diff --git a/scenes/game_scene.c b/scenes/game_scene.c index e641981..e7f4c06 100644 --- a/scenes/game_scene.c +++ b/scenes/game_scene.c @@ -131,7 +131,7 @@ static void render_regular_game_scene(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}, 0.0f, false); + draw_sprite(data->tile_sprites[tilemap.tiles[i].tile_type], 0, (Vector2){x,y}, 0.0f, false); } else if (tilemap.tiles[i].tile_type == SOLID_TILE) { @@ -223,7 +223,7 @@ static void render_regular_game_scene(Scene_t* scene) if (spr.sprite != NULL) { Vector2 pos = Vector2Add(p_ct->position, spr.offset); - draw_sprite(spr.sprite, pos, 0.0f, p_cspr->flip_x); + draw_sprite(spr.sprite, p_cspr->current_frame, pos, 0.0f, p_cspr->flip_x); } continue; } diff --git a/scenes/game_systems.c b/scenes/game_systems.c index b02fdc2..0c56111 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -1898,14 +1898,14 @@ void sprite_animation_system(Scene_t* scene) SpriteRenderInfo_t spr = p_cspr->sprites[p_cspr->current_idx]; if (spr.sprite == NULL) continue; - if (reset) spr.sprite->current_frame = 0; + if (reset) p_cspr->current_frame = 0; // Animate it (handle frame count) spr.sprite->elapsed++; if (spr.sprite->elapsed == spr.sprite->speed) { - spr.sprite->current_frame++; - spr.sprite->current_frame %= spr.sprite->frame_count; + p_cspr->current_frame++; + p_cspr->current_frame %= spr.sprite->frame_count; spr.sprite->elapsed = 0; } } diff --git a/water_test.c b/water_test.c index e8f1a29..087b205 100644 --- a/water_test.c +++ b/water_test.c @@ -109,7 +109,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, 0.0f, p_cspr->flip_x); + draw_sprite(spr.sprite, p_cspr->current_frame, pos, 0.0f, p_cspr->flip_x); } } }