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 trackscene_man
parent
0f485d89f2
commit
98450d0bba
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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->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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue