Experiment with timer-based transition

main
En Yi 2024-08-19 14:24:22 +08:00
parent 019f39f84c
commit e37e89505a
3 changed files with 30 additions and 8 deletions

View File

@ -1114,14 +1114,28 @@ static void at_level_dead(Scene_t* scene)
LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data);
Entity_t* p_player = create_player(&scene->ent_manager);
p_player->position = data->player_spawn;
data->sm.state = LEVEL_STATE_STARTING;
CPlayerState_t* p_pstate = get_component(p_player, CPLAYERSTATE_T);
if (data->camera.mode == CAMERA_RANGED_MOVEMENT)
{
p_pstate->locked = true;
}
change_level_state(data, LEVEL_STATE_STARTING);
}
static void at_level_complete(Scene_t* scene)
{
LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data);
do_action(scene, ACTION_NEXTLEVEL, true);
data->sm.state = LEVEL_STATE_STARTING;
data->sm.fractional += scene->delta_time;
if (data->sm.fractional > 1.0f)
{
data->sm.fractional -= 1.0f;
data->sm.counter++;
}
if (data->sm.counter >= 3)
{
do_action(scene, ACTION_NEXTLEVEL, true);
at_level_dead(scene);
}
}
void init_sandbox_scene(LevelScene_t* scene)

View File

@ -244,7 +244,7 @@ void check_player_dead_system(Scene_t* scene)
ent->position = p_player->position;
}
destroy_entity(scene, &data->tilemap, p_player);
data->sm.state = LEVEL_STATE_DEAD;
change_level_state(data, LEVEL_STATE_DEAD);
}
}
}
@ -1467,10 +1467,8 @@ void update_tilemap_system(Scene_t* scene)
{
Entity_t* p_ent = get_entity(&scene->ent_manager, ent_idx);
if (!p_ent->m_alive) continue;
CTransform_t* p_ctransform = get_component(p_ent, CTRANSFORM_COMP_T);
if (p_ctransform == NULL) continue;
CBBox_t* p_bbox = get_component(p_ent, CBBOX_COMP_T);
CBBox_t* p_bbox = get_component(p_ent, CBBOX_COMP_T);
// Update tilemap position
for (size_t i = 0;i < p_tilecoord->n_tiles; ++i)
{
@ -2019,7 +2017,10 @@ void level_end_detection_system(Scene_t* scene)
)
)
{
lvl_scene->data.sm.state = LEVEL_STATE_COMPLETE;
destroy_entity(scene, &lvl_scene->data.tilemap, p_other_ent);
change_level_state(&lvl_scene->data, LEVEL_STATE_COMPLETE);
//do_action(scene, ACTION_NEXTLEVEL, true);
}
}

View File

@ -77,6 +77,13 @@ typedef struct LevelSceneData {
LevelSceneStateMachine_t sm;
}LevelSceneData_t;
static inline void change_level_state(LevelSceneData_t* data, LevelSceneState_t state)
{
data->sm.state = state;
data->sm.counter = 0;
data->sm.fractional = 0;
}
typedef struct LevelScene {
Scene_t scene;
LevelSceneData_t data;