Add null checks when creating new entity

Also, fix player spawn to reuse the player
scene_man
En Yi 2023-08-17 21:51:11 +08:00
parent 93e3b24e40
commit 8c889690e8
5 changed files with 27 additions and 11 deletions

View File

@ -528,6 +528,7 @@ static void spawn_crate(Scene_t* scene, unsigned int tile_idx, bool metal, Conta
{ {
LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data);
Entity_t* p_crate = create_crate(&scene->ent_manager, &scene->engine->assets, metal, item); Entity_t* p_crate = create_crate(&scene->ent_manager, &scene->engine->assets, metal, item);
if (p_crate == NULL) return;
CTransform_t* p_ctransform = get_component(p_crate, CTRANSFORM_COMP_T); CTransform_t* p_ctransform = get_component(p_crate, CTRANSFORM_COMP_T);
p_ctransform->position.x = (tile_idx % data->tilemap.width) * TILE_SIZE; p_ctransform->position.x = (tile_idx % data->tilemap.width) * TILE_SIZE;
@ -539,6 +540,7 @@ static void spawn_boulder(Scene_t* scene, unsigned int tile_idx)
{ {
LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data);
Entity_t* p_boulder = create_boulder(&scene->ent_manager, &scene->engine->assets); Entity_t* p_boulder = create_boulder(&scene->ent_manager, &scene->engine->assets);
if (p_boulder == NULL) return;
CTransform_t* p_ctransform = get_component(p_boulder, CTRANSFORM_COMP_T); CTransform_t* p_ctransform = get_component(p_boulder, CTRANSFORM_COMP_T);
p_ctransform->position.x = (tile_idx % data->tilemap.width) * TILE_SIZE; p_ctransform->position.x = (tile_idx % data->tilemap.width) * TILE_SIZE;

View File

@ -217,6 +217,7 @@ void free_component_to_mempool(ComponentEnum_t comp_type, unsigned long idx)
void print_mempool_stats(char* buffer) void print_mempool_stats(char* buffer)
{ {
buffer += sprintf(buffer, "Entity free: %u\n", ent_mempool.free_list.count);
for (size_t i = 0; i < N_COMPONENTS; ++i) for (size_t i = 0; i < N_COMPONENTS; ++i)
{ {
buffer += sprintf( buffer += sprintf(

View File

@ -202,7 +202,6 @@ void player_respawn_system(Scene_t* scene)
LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data);
TileGrid_t tilemap = data->tilemap; TileGrid_t tilemap = data->tilemap;
Entity_t* p_player; Entity_t* p_player;
uint8_t to_respawn = 0;
// Cannot create player while looping though the players // Cannot create player while looping though the players
// So have to create outside of the loop // So have to create outside of the loop
sc_map_foreach_value(&scene->ent_manager.entities_map[PLAYER_ENT_TAG], p_player) sc_map_foreach_value(&scene->ent_manager.entities_map[PLAYER_ENT_TAG], p_player)
@ -210,16 +209,18 @@ void player_respawn_system(Scene_t* scene)
if (!p_player->m_alive) if (!p_player->m_alive)
{ {
CTransform_t* p_ct = get_component(p_player, CTRANSFORM_COMP_T); CTransform_t* p_ct = get_component(p_player, CTRANSFORM_COMP_T);
remove_entity_from_tilemap(&scene->ent_manager, &tilemap, p_player);
Entity_t* ent = create_dead_player(&scene->ent_manager, &scene->engine->assets); Entity_t* ent = create_dead_player(&scene->ent_manager, &scene->engine->assets);
if (ent != NULL)
{
CTransform_t* new_ct = get_component(ent, CTRANSFORM_COMP_T); CTransform_t* new_ct = get_component(ent, CTRANSFORM_COMP_T);
memcpy(&new_ct->position, &p_ct->position, sizeof(p_ct->position)); memcpy(&new_ct->position, &p_ct->position, sizeof(p_ct->position));
to_respawn++;
} }
p_player->m_alive = true;
memset(&p_ct->position, 0, sizeof(p_ct->position));
memset(&p_ct->velocity, 0, sizeof(p_ct->velocity));
memset(&p_ct->accel, 0, sizeof(p_ct->accel));
} }
if (to_respawn > 0)
{
create_player(&scene->ent_manager, &scene->engine->assets);
} }
} }

View File

@ -34,8 +34,9 @@ bool init_item_creation(Assets_t* assets)
Entity_t* create_crate(EntityManager_t* ent_manager, Assets_t* assets, bool metal, ContainerItem_t item) Entity_t* create_crate(EntityManager_t* ent_manager, Assets_t* assets, bool metal, ContainerItem_t item)
{ {
Entity_t* p_crate = add_entity(ent_manager, CRATES_ENT_TAG); Entity_t* p_crate = add_entity(ent_manager, CRATES_ENT_TAG);
CBBox_t* p_bbox = add_component(p_crate, CBBOX_COMP_T); if (p_crate == NULL) return NULL;
CBBox_t* p_bbox = add_component(p_crate, CBBOX_COMP_T);
set_bbox(p_bbox, TILE_SIZE, TILE_SIZE); set_bbox(p_bbox, TILE_SIZE, TILE_SIZE);
p_bbox->solid = true; p_bbox->solid = true;
p_bbox->fragile = !metal; p_bbox->fragile = !metal;
@ -75,8 +76,9 @@ Entity_t* create_crate(EntityManager_t* ent_manager, Assets_t* assets, bool meta
Entity_t* create_boulder(EntityManager_t* ent_manager, Assets_t* assets) Entity_t* create_boulder(EntityManager_t* ent_manager, Assets_t* assets)
{ {
Entity_t* p_boulder = add_entity(ent_manager, BOULDER_ENT_TAG); Entity_t* p_boulder = add_entity(ent_manager, BOULDER_ENT_TAG);
CBBox_t* p_bbox = add_component(p_boulder, CBBOX_COMP_T); if (p_boulder == NULL) return NULL;
CBBox_t* p_bbox = add_component(p_boulder, CBBOX_COMP_T);
set_bbox(p_bbox, TILE_SIZE, TILE_SIZE); set_bbox(p_bbox, TILE_SIZE, TILE_SIZE);
p_bbox->solid = true; p_bbox->solid = true;
p_bbox->fragile = false; p_bbox->fragile = false;
@ -99,6 +101,8 @@ Entity_t* create_boulder(EntityManager_t* ent_manager, Assets_t* assets)
Entity_t* create_arrow(EntityManager_t* ent_manager, Assets_t* assets, uint8_t dir) Entity_t* create_arrow(EntityManager_t* ent_manager, Assets_t* assets, uint8_t dir)
{ {
Entity_t* p_arrow = add_entity(ent_manager, DESTRUCTABLE_ENT_TAG); Entity_t* p_arrow = add_entity(ent_manager, DESTRUCTABLE_ENT_TAG);
if (p_arrow == NULL) return NULL;
add_component(p_arrow, CTILECOORD_COMP_T); add_component(p_arrow, CTILECOORD_COMP_T);
CHitBoxes_t* p_hitbox = add_component(p_arrow, CHITBOXES_T); CHitBoxes_t* p_hitbox = add_component(p_arrow, CHITBOXES_T);
p_hitbox->n_boxes = 1; p_hitbox->n_boxes = 1;
@ -143,6 +147,8 @@ Entity_t* create_arrow(EntityManager_t* ent_manager, Assets_t* assets, uint8_t d
Entity_t* create_bomb(EntityManager_t* ent_manager, Assets_t* assets, Vector2 launch_dir) Entity_t* create_bomb(EntityManager_t* ent_manager, Assets_t* assets, Vector2 launch_dir)
{ {
Entity_t* p_bomb = add_entity(ent_manager, DESTRUCTABLE_ENT_TAG); Entity_t* p_bomb = add_entity(ent_manager, DESTRUCTABLE_ENT_TAG);
if (p_bomb == NULL) return NULL;
add_component(p_bomb, CTILECOORD_COMP_T); add_component(p_bomb, CTILECOORD_COMP_T);
add_component(p_bomb, CMOVEMENTSTATE_T); add_component(p_bomb, CMOVEMENTSTATE_T);
CHitBoxes_t* p_hitbox = add_component(p_bomb, CHITBOXES_T); CHitBoxes_t* p_hitbox = add_component(p_bomb, CHITBOXES_T);
@ -173,6 +179,8 @@ Entity_t* create_bomb(EntityManager_t* ent_manager, Assets_t* assets, Vector2 la
Entity_t* create_explosion(EntityManager_t* ent_manager, Assets_t* assets) Entity_t* create_explosion(EntityManager_t* ent_manager, Assets_t* assets)
{ {
Entity_t* p_explosion = add_entity(ent_manager, DESTRUCTABLE_ENT_TAG); Entity_t* p_explosion = add_entity(ent_manager, DESTRUCTABLE_ENT_TAG);
if (p_explosion == NULL) return NULL;
add_component(p_explosion, CTILECOORD_COMP_T); add_component(p_explosion, CTILECOORD_COMP_T);
CHitBoxes_t* p_hitbox = add_component(p_explosion, CHITBOXES_T); CHitBoxes_t* p_hitbox = add_component(p_explosion, CHITBOXES_T);
p_hitbox->n_boxes = 1; p_hitbox->n_boxes = 1;

View File

@ -58,6 +58,8 @@ static unsigned int player_sprite_transition_func(Entity_t* ent)
Entity_t* create_player(EntityManager_t* ent_manager, Assets_t* assets) Entity_t* create_player(EntityManager_t* ent_manager, Assets_t* assets)
{ {
Entity_t* p_ent = add_entity(ent_manager, PLAYER_ENT_TAG); Entity_t* p_ent = add_entity(ent_manager, PLAYER_ENT_TAG);
if (p_ent == NULL) return NULL;
CBBox_t* p_bbox = add_component(p_ent, CBBOX_COMP_T); CBBox_t* p_bbox = add_component(p_ent, CBBOX_COMP_T);
set_bbox(p_bbox, PLAYER_WIDTH, PLAYER_HEIGHT); set_bbox(p_bbox, PLAYER_WIDTH, PLAYER_HEIGHT);
@ -98,6 +100,8 @@ Entity_t* create_player(EntityManager_t* ent_manager, Assets_t* assets)
Entity_t* create_dead_player(EntityManager_t* ent_manager, Assets_t* assets) Entity_t* create_dead_player(EntityManager_t* ent_manager, Assets_t* assets)
{ {
Entity_t* p_ent = add_entity(ent_manager, NO_ENT_TAG); Entity_t* p_ent = add_entity(ent_manager, NO_ENT_TAG);
if (p_ent == NULL) return NULL;
CTransform_t* p_ct = add_component(p_ent, CTRANSFORM_COMP_T); CTransform_t* p_ct = add_component(p_ent, CTRANSFORM_COMP_T);
p_ct->active = true; p_ct->active = true;
p_ct->shape_factor = (Vector2){1, 1}; p_ct->shape_factor = (Vector2){1, 1};