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_man
En Yi 2023-05-20 18:23:26 +08:00
parent 0f485d89f2
commit 98450d0bba
6 changed files with 40 additions and 26 deletions

View File

@ -29,6 +29,8 @@ int main(void)
LevelScene_t scene; LevelScene_t scene;
scene.scene.engine = &engine; scene.scene.engine = &engine;
init_level_scene(&scene); 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; scenes[0] = &scene.scene;
change_scene(&engine, 0); change_scene(&engine, 0);

View File

@ -16,6 +16,7 @@ enum EntitySpawnSelection {
SPAWN_CRATE, SPAWN_CRATE,
SPAWN_METAL_CRATE, SPAWN_METAL_CRATE,
}; };
#define MAX_SPAWN_TYPE 5 #define MAX_SPAWN_TYPE 5
static unsigned int current_spawn_selection = 0; 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; int y = (i / tilemap.width) * TILE_SIZE;
sprintf(buffer, "%u", sc_map_size_64(&tilemap.tiles[i].entities_set)); 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); 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); CSprite_t* p_cspr = get_component(&scene->ent_manager, p_ent, CSPRITE_T);
if (p_cspr != NULL) if (p_cspr != NULL)
{ {
Vector2 pos = Vector2Add(p_ct->position, p_cspr->offset); const SpriteRenderInfo_t spr = p_cspr->sprites[p_cspr->current_idx];
draw_sprite(p_cspr->sprite, pos); 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; scene->data.tilemap.n_tiles = scene->data.tilemap.width * scene->data.tilemap.height;
assert(scene->data.tilemap.n_tiles <= MAX_N_TILES); assert(scene->data.tilemap.n_tiles <= MAX_N_TILES);
scene->data.tilemap.tiles = all_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++) for (size_t i = 0; i < MAX_N_TILES;i++)
{ {
all_tiles[i].solid = NOT_SOLID; all_tiles[i].solid = NOT_SOLID;

View File

@ -114,11 +114,17 @@ typedef struct Sprite {
} Sprite_t; } Sprite_t;
typedef unsigned int (*sprite_transition_func_t)(Entity_t *ent); // Transition requires knowledge of the entity typedef unsigned int (*sprite_transition_func_t)(Entity_t *ent); // Transition requires knowledge of the entity
typedef struct _CSprite_t { typedef struct _SpriteRenderInfo
const char * const *sprites_map; //Array of all sprite names associated {
Sprite_t* sprite; Sprite_t* sprite;
sprite_transition_func_t transition_func;
Vector2 offset; 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; unsigned int current_idx;
} CSprite_t; } CSprite_t;

View File

@ -1071,22 +1071,18 @@ void sprite_animation_system(Scene_t* scene)
unsigned int spr_idx = p_cspr->transition_func(p_ent); unsigned int spr_idx = p_cspr->transition_func(p_ent);
if (p_cspr->current_idx != spr_idx) 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->current_idx = spr_idx;
p_cspr->sprite->current_frame = 0; p_cspr->sprites[spr_idx].sprite->current_frame = 0;
}
} }
} }
SpriteRenderInfo_t spr = p_cspr->sprites[p_cspr->current_idx];
// Animate it (handle frame count) // Animate it (handle frame count)
p_cspr->sprite->elapsed++; spr.sprite->elapsed++;
if (p_cspr->sprite->elapsed == p_cspr->sprite->speed) if (spr.sprite->elapsed == spr.sprite->speed)
{ {
p_cspr->sprite->current_frame++; spr.sprite->current_frame++;
p_cspr->sprite->current_frame %= p_cspr->sprite->frame_count; spr.sprite->current_frame %= spr.sprite->frame_count;
p_cspr->sprite->elapsed = 0; spr.sprite->elapsed = 0;
} }
} }
} }

View File

@ -8,10 +8,7 @@ enum PlayerSpriteEnum
SPR_PLAYER_RUN SPR_PLAYER_RUN
}; };
static const char* const player_sprite_map[N_PLAYER_SPRITES] = { static SpriteRenderInfo_t player_sprite_map[N_PLAYER_SPRITES] = {0};
"plr_stand",
"plr_run",
};
static unsigned int player_sprite_transition_func(Entity_t* ent) 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, .height = p_bbox->size.y - 1,
}; };
CSprite_t* p_cspr = add_component(ent_manager, p_ent, CSPRITE_T); CSprite_t* p_cspr = add_component(ent_manager, p_ent, CSPRITE_T);
p_cspr->sprite = get_sprite(assets, "plr_stand"); p_cspr->sprites = player_sprite_map;
p_cspr->offset = (Vector2){0, -20}; p_cspr->sprites[0].sprite = get_sprite(assets, "plr_stand");
p_cspr->sprites_map = player_sprite_map; 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; p_cspr->transition_func = &player_sprite_transition_func;
return p_ent; return p_ent;

View File

@ -17,7 +17,7 @@ typedef enum TileType {
ONEWAY_TILE, ONEWAY_TILE,
LADDER LADDER
} TileType_t; } TileType_t;
#define MAX_TILE_TYPES 4
typedef enum SolidType typedef enum SolidType
{ {
NOT_SOLID = 0, NOT_SOLID = 0,
@ -45,6 +45,7 @@ typedef struct LevelSceneData {
RenderTexture2D game_viewport; RenderTexture2D game_viewport;
Rectangle game_rec; Rectangle game_rec;
Camera2D cam; Camera2D cam;
Sprite_t* tile_sprites[MAX_TILE_TYPES];
}LevelSceneData_t; }LevelSceneData_t;
typedef struct LevelScene { typedef struct LevelScene {