From e37e89505a53d33f572fdd78b374ac63bc299fd0 Mon Sep 17 00:00:00 2001 From: En Yi Date: Mon, 19 Aug 2024 14:24:22 +0800 Subject: [PATCH] Experiment with timer-based transition --- scenes/editor_scene.c | 20 +++++++++++++++++--- scenes/game_systems.c | 11 ++++++----- scenes/scene_impl.h | 7 +++++++ 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index 3132207..3e5f474 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -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) diff --git a/scenes/game_systems.c b/scenes/game_systems.c index c19553c..82751d4 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -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); } } diff --git a/scenes/scene_impl.h b/scenes/scene_impl.h index b0a4fb4..66a624d 100644 --- a/scenes/scene_impl.h +++ b/scenes/scene_impl.h @@ -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;