From 62ecd3c0faec4c37a6cb3cc75faa28516372d23e Mon Sep 17 00:00:00 2001 From: En Yi Date: Wed, 16 Aug 2023 23:45:34 +0800 Subject: [PATCH] Create simple dead player respawn system Changelog: - Add player dead sprite - Add function to create dead player entity - It is easier to create a new entity than to transform an existing one - Update existing respawn system --- scenes/editor_scene.c | 2 +- scenes/ent_impl.h | 1 + scenes/game_systems.c | 20 +++++++++++++++----- scenes/player_ent.c | 21 ++++++++++++++++++++- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index 9b7031f..21cc6f7 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -860,8 +860,8 @@ void init_sandbox_scene(LevelScene_t* scene) sc_array_add(&scene->scene.systems, &sprite_animation_system); sc_array_add(&scene->scene.systems, &camera_update_system); sc_array_add(&scene->scene.systems, &player_dir_reset_system); - sc_array_add(&scene->scene.systems, &player_respawn_system); sc_array_add(&scene->scene.systems, &update_water_runner_system); + sc_array_add(&scene->scene.systems, &player_respawn_system); sc_array_add(&scene->scene.systems, &toggle_block_system); // This avoid graphical glitch, not essential diff --git a/scenes/ent_impl.h b/scenes/ent_impl.h index 744f563..78ff849 100644 --- a/scenes/ent_impl.h +++ b/scenes/ent_impl.h @@ -15,6 +15,7 @@ typedef enum EntityTag { bool init_player_creation(const char* info_file, Assets_t* assets); Entity_t* create_player(EntityManager_t* ent_manager, Assets_t* assets); +Entity_t* create_dead_player(EntityManager_t* ent_manager, Assets_t* assets); bool init_item_creation(Assets_t* assets); diff --git a/scenes/game_systems.c b/scenes/game_systems.c index 9ca86cb..a64ea60 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -199,18 +199,28 @@ static Vector2 shift_bbox(Vector2 bbox, Vector2 new_bbox, AnchorPoint_t anchor) void player_respawn_system(Scene_t* scene) { + LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); + TileGrid_t tilemap = data->tilemap; Entity_t* p_player; + uint8_t to_respawn = 0; + // Cannot create player while looping though the players + // So have to create outside of the loop sc_map_foreach_value(&scene->ent_manager.entities_map[PLAYER_ENT_TAG], p_player) { if (!p_player->m_alive) { - p_player->m_alive = true; - CTransform_t* p_ctransform = get_component(p_player, CTRANSFORM_COMP_T); - memset(&p_ctransform->position, 0, sizeof(p_ctransform->position)); - memset(&p_ctransform->velocity, 0, sizeof(p_ctransform->velocity)); - memset(&p_ctransform->accel, 0, sizeof(p_ctransform->accel)); + 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); + CTransform_t* new_ct = get_component(ent, CTRANSFORM_COMP_T); + memcpy(&new_ct->position, &p_ct->position, sizeof(p_ct->position)); + to_respawn++; } } + if (to_respawn > 0) + { + create_player(&scene->ent_manager, &scene->engine->assets); + } } void player_dir_reset_system(Scene_t* scene) diff --git a/scenes/player_ent.c b/scenes/player_ent.c index 6eaffbf..746c5c1 100644 --- a/scenes/player_ent.c +++ b/scenes/player_ent.c @@ -4,7 +4,7 @@ #include #include "raymath.h" -#define N_PLAYER_SPRITES 8 +#define N_PLAYER_SPRITES 9 enum PlayerSpriteEnum { SPR_PLAYER_STAND = 0, @@ -15,6 +15,7 @@ enum PlayerSpriteEnum SPR_PLAYER_CROUCH, SPR_PLAYER_CRMOVE, SPR_PLAYER_SWIM, + SPR_PLAYER_DEAD, }; static SpriteRenderInfo_t player_sprite_map[N_PLAYER_SPRITES] = {0}; @@ -25,6 +26,7 @@ static unsigned int player_sprite_transition_func(Entity_t* ent) CMovementState_t* p_move = get_component(ent, CMOVEMENTSTATE_T); CSprite_t* p_spr = get_component(ent, CSPRITE_T); CPlayerState_t* p_plr = get_component(ent, CPLAYERSTATE_T); + if (p_ctrans->velocity.x > 0) p_spr->flip_x = true; else if (p_ctrans->velocity.x < 0) p_spr->flip_x = false; @@ -93,6 +95,23 @@ Entity_t* create_player(EntityManager_t* ent_manager, Assets_t* assets) return p_ent; } +Entity_t* create_dead_player(EntityManager_t* ent_manager, Assets_t* assets) +{ + Entity_t* p_ent = add_entity(ent_manager, NO_ENT_TAG); + CTransform_t* p_ct = add_component(p_ent, CTRANSFORM_COMP_T); + p_ct->active = true; + p_ct->shape_factor = (Vector2){1, 1}; + p_ct->velocity.y = -450; + + CSprite_t* p_cspr = add_component(p_ent, CSPRITE_T); + p_cspr->sprites = player_sprite_map; + p_cspr->current_idx = SPR_PLAYER_DEAD; + + add_component(p_ent, CMOVEMENTSTATE_T); + + return p_ent; +} + bool init_player_creation(const char* info_file, Assets_t* assets) { static bool already_init = false;