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;
|
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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue