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 systemscene_man
parent
cb68c6c6f4
commit
62ecd3c0fa
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue