From 98450d0bbaa01d1157b7fa5faa10f94ad384cd77 Mon Sep 17 00:00:00 2001 From: En Yi Date: Sat, 20 May 2023 18:23:26 +0800 Subject: [PATCH] Rework Entity Sprite Component & Add Tile Sprite Changelog: - Add tile sprites as part of Level Data - Render tile sprite if loaded in - CSprite now stores array of sprite rendering info - use current idx to keep track --- scene_test.c | 2 ++ scenes/editor_scene.c | 16 +++++++++++++--- scenes/engine/EC/components.h | 12 +++++++++--- scenes/game_systems.c | 20 ++++++++------------ scenes/player_ent.c | 13 ++++++------- scenes/scene_impl.h | 3 ++- 6 files changed, 40 insertions(+), 26 deletions(-) diff --git a/scene_test.c b/scene_test.c index 70a60c3..569c216 100644 --- a/scene_test.c +++ b/scene_test.c @@ -29,6 +29,8 @@ int main(void) LevelScene_t scene; scene.scene.engine = &engine; init_level_scene(&scene); + scene.data.tile_sprites[ONEWAY_TILE] = get_sprite(&engine.assets, "tl_owp"); + scene.data.tile_sprites[LADDER] = get_sprite(&engine.assets, "tl_ldr"); scenes[0] = &scene.scene; change_scene(&engine, 0); diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index 20dbbd5..2e76c94 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -16,6 +16,7 @@ enum EntitySpawnSelection { SPAWN_CRATE, SPAWN_METAL_CRATE, }; + #define MAX_SPAWN_TYPE 5 static unsigned int current_spawn_selection = 0; @@ -49,7 +50,11 @@ static void level_scene_render_func(Scene_t* scene) int y = (i / tilemap.width) * TILE_SIZE; sprintf(buffer, "%u", sc_map_size_64(&tilemap.tiles[i].entities_set)); - if (tilemap.tiles[i].tile_type == SOLID_TILE) + if (data->tile_sprites[tilemap.tiles[i].tile_type] != NULL) + { + draw_sprite(data->tile_sprites[tilemap.tiles[i].tile_type], (Vector2){x,y}); + } + else if (tilemap.tiles[i].tile_type == SOLID_TILE) { DrawRectangle(x, y, TILE_SIZE, TILE_SIZE, BLACK); } @@ -116,8 +121,12 @@ static void level_scene_render_func(Scene_t* scene) CSprite_t* p_cspr = get_component(&scene->ent_manager, p_ent, CSPRITE_T); if (p_cspr != NULL) { - Vector2 pos = Vector2Add(p_ct->position, p_cspr->offset); - draw_sprite(p_cspr->sprite, pos); + const SpriteRenderInfo_t spr = p_cspr->sprites[p_cspr->current_idx]; + if (spr.sprite != NULL) + { + Vector2 pos = Vector2Add(p_ct->position, spr.offset); + draw_sprite(spr.sprite, pos); + } } } @@ -413,6 +422,7 @@ void init_level_scene(LevelScene_t* scene) scene->data.tilemap.n_tiles = scene->data.tilemap.width * scene->data.tilemap.height; assert(scene->data.tilemap.n_tiles <= MAX_N_TILES); scene->data.tilemap.tiles = all_tiles; + memset(scene->data.tile_sprites, 0, sizeof(scene->data.tile_sprites)); for (size_t i = 0; i < MAX_N_TILES;i++) { all_tiles[i].solid = NOT_SOLID; diff --git a/scenes/engine/EC/components.h b/scenes/engine/EC/components.h index c9ddcfc..e23458a 100644 --- a/scenes/engine/EC/components.h +++ b/scenes/engine/EC/components.h @@ -114,11 +114,17 @@ typedef struct Sprite { } Sprite_t; typedef unsigned int (*sprite_transition_func_t)(Entity_t *ent); // Transition requires knowledge of the entity -typedef struct _CSprite_t { - const char * const *sprites_map; //Array of all sprite names associated +typedef struct _SpriteRenderInfo +{ Sprite_t* sprite; - sprite_transition_func_t transition_func; 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; } CSprite_t; diff --git a/scenes/game_systems.c b/scenes/game_systems.c index 3c2ba66..8479ce1 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -1071,22 +1071,18 @@ void sprite_animation_system(Scene_t* scene) unsigned int spr_idx = p_cspr->transition_func(p_ent); if (p_cspr->current_idx != spr_idx) { - Sprite_t* new_spr = get_sprite(&scene->engine->assets, p_cspr->sprites_map[spr_idx]); - if (new_spr != NULL) - { - p_cspr->sprite = new_spr; - p_cspr->current_idx = spr_idx; - p_cspr->sprite->current_frame = 0; - } + p_cspr->current_idx = spr_idx; + p_cspr->sprites[spr_idx].sprite->current_frame = 0; } } + SpriteRenderInfo_t spr = p_cspr->sprites[p_cspr->current_idx]; // Animate it (handle frame count) - p_cspr->sprite->elapsed++; - if (p_cspr->sprite->elapsed == p_cspr->sprite->speed) + spr.sprite->elapsed++; + if (spr.sprite->elapsed == spr.sprite->speed) { - p_cspr->sprite->current_frame++; - p_cspr->sprite->current_frame %= p_cspr->sprite->frame_count; - p_cspr->sprite->elapsed = 0; + spr.sprite->current_frame++; + spr.sprite->current_frame %= spr.sprite->frame_count; + spr.sprite->elapsed = 0; } } } diff --git a/scenes/player_ent.c b/scenes/player_ent.c index 55f1231..0f76f2b 100644 --- a/scenes/player_ent.c +++ b/scenes/player_ent.c @@ -8,10 +8,7 @@ enum PlayerSpriteEnum SPR_PLAYER_RUN }; -static const char* const player_sprite_map[N_PLAYER_SPRITES] = { - "plr_stand", - "plr_run", -}; +static SpriteRenderInfo_t player_sprite_map[N_PLAYER_SPRITES] = {0}; static unsigned int player_sprite_transition_func(Entity_t* ent) { @@ -49,9 +46,11 @@ Entity_t* create_player(EntityManager_t* ent_manager, Assets_t* assets) .height = p_bbox->size.y - 1, }; CSprite_t* p_cspr = add_component(ent_manager, p_ent, CSPRITE_T); - p_cspr->sprite = get_sprite(assets, "plr_stand"); - p_cspr->offset = (Vector2){0, -20}; - p_cspr->sprites_map = player_sprite_map; + p_cspr->sprites = player_sprite_map; + p_cspr->sprites[0].sprite = get_sprite(assets, "plr_stand"); + p_cspr->sprites[0].offset = (Vector2){0, -20}; + p_cspr->sprites[1].sprite = get_sprite(assets, "plr_stand"); + p_cspr->sprites[1].offset = (Vector2){0, -20}; p_cspr->transition_func = &player_sprite_transition_func; return p_ent; diff --git a/scenes/scene_impl.h b/scenes/scene_impl.h index 2e67c9b..86a8fb0 100644 --- a/scenes/scene_impl.h +++ b/scenes/scene_impl.h @@ -17,7 +17,7 @@ typedef enum TileType { ONEWAY_TILE, LADDER } TileType_t; - +#define MAX_TILE_TYPES 4 typedef enum SolidType { NOT_SOLID = 0, @@ -45,6 +45,7 @@ typedef struct LevelSceneData { RenderTexture2D game_viewport; Rectangle game_rec; Camera2D cam; + Sprite_t* tile_sprites[MAX_TILE_TYPES]; }LevelSceneData_t; typedef struct LevelScene {