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
scene_man
En Yi 2023-08-16 23:45:34 +08:00
parent cb68c6c6f4
commit 62ecd3c0fa
4 changed files with 37 additions and 7 deletions

View File

@ -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

View File

@ -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);

View File

@ -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)

View File

@ -4,7 +4,7 @@
#include <string.h>
#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;