Continue plan data struct for scene management
parent
f98e242378
commit
0653cbd0a2
|
@ -21,17 +21,11 @@ typedef struct SceneNode {
|
|||
Scene_t* next;
|
||||
} SceneNode_t;
|
||||
|
||||
typedef struct SceneManager {
|
||||
Scene_t **scenes; // Array of all possible scenes
|
||||
unsigned int max_scenes;
|
||||
SceneNode_t* active; // Scenes to update. This allows multiple scene updates
|
||||
SceneNode_t* to_render; // Scenes to render. This allows duplicate rendering
|
||||
} SceneManger_t;
|
||||
|
||||
typedef struct GameEngine {
|
||||
Scene_t **scenes;
|
||||
unsigned int max_scenes;
|
||||
unsigned int curr_scene;
|
||||
Scene_t* scenes_render_order[MAX_SCENES_TO_RENDER];
|
||||
Assets_t assets;
|
||||
SFXList_t sfx_list;
|
||||
// Maintain own queue to handle key presses
|
||||
|
@ -42,20 +36,22 @@ typedef struct GameEngine {
|
|||
Vector2 intended_window_size;
|
||||
} GameEngine_t;
|
||||
|
||||
//typedef enum SceneType {
|
||||
// LEVEL_SCENE = 0,
|
||||
// MENU_SCENE,
|
||||
//}SceneType_t;
|
||||
|
||||
typedef enum SceneState {
|
||||
SCENE_PLAYING = 0,
|
||||
SCENE_SUSPENDED,
|
||||
SCENE_PLAYING = 0, // All Systems Active
|
||||
SCENE_SUSPENDED, //
|
||||
SCENE_ENDED,
|
||||
}SceneState_t;
|
||||
|
||||
typedef void(*render_func_t)(Scene_t*);
|
||||
#define SCENE_ACTIVE_BIT (1 << 0) // Systems Active
|
||||
#define SCENE_RENDER_BIT (1 << 1) // Whether to render
|
||||
|
||||
typedef enum ActionResult {
|
||||
ACTION_PROPAGATE = 0,
|
||||
ACTION_CONSUMED,
|
||||
} ActionResult;
|
||||
|
||||
typedef void(*system_func_t)(Scene_t*);
|
||||
typedef void(*action_func_t)(Scene_t*, ActionType_t, bool);
|
||||
typedef ActionResult(*action_func_t)(Scene_t*, ActionType_t, bool);
|
||||
sc_array_def(system_func_t, systems);
|
||||
|
||||
typedef struct RenderLayer {
|
||||
|
@ -69,20 +65,23 @@ typedef struct SceneRenderLayers {
|
|||
} SceneRenderLayers_t;
|
||||
|
||||
struct Scene {
|
||||
// Not all scene needs an entity manager
|
||||
// but too late to change this
|
||||
EntityManager_t ent_manager;
|
||||
Scene_t* parent_scene;
|
||||
struct sc_map_64 action_map; // key -> actions
|
||||
struct sc_array_systems systems;
|
||||
SceneRenderLayers_t layers;
|
||||
Color bg_colour;
|
||||
action_func_t action_function;
|
||||
EntityManager_t ent_manager; // TODO: need move in data, Not all scene need this
|
||||
float delta_time;
|
||||
float time_scale;
|
||||
Vector2 mouse_pos;
|
||||
//SceneType_t scene_type;
|
||||
SceneState_t state;
|
||||
ParticleSystem_t part_sys;
|
||||
GameEngine_t *engine;
|
||||
int8_t depth_index;
|
||||
SceneNode_t child_scene; // Intrusive Linked List for children scene
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef _ENGINE_CONF_H
|
||||
#define _ENGINE_CONF_H
|
||||
|
||||
#define MAX_SCENES_TO_RENDER 16
|
||||
#define MAX_RENDER_LAYERS 4
|
||||
#define MAX_ENTITIES 2048
|
||||
#define MAX_TEXTURES 16
|
||||
|
|
|
@ -34,4 +34,10 @@ typedef enum SFXTag {
|
|||
BUBBLE_SFX,
|
||||
COIN_SFX,
|
||||
} SFXTag_t;
|
||||
|
||||
//typedef enum SceneType {
|
||||
// LEVEL_SCENE = 0,
|
||||
// MENU_SCENE,
|
||||
//}SceneType_t;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -797,7 +797,7 @@ static void restart_editor_level(Scene_t* scene)
|
|||
}
|
||||
}
|
||||
|
||||
static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed)
|
||||
static ActionResult level_do_action(Scene_t* scene, ActionType_t action, bool pressed)
|
||||
{
|
||||
LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data);
|
||||
Entity_t* p_player;
|
||||
|
@ -1002,6 +1002,7 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed)
|
|||
break;
|
||||
}
|
||||
}
|
||||
return ACTION_PROPAGATE;
|
||||
}
|
||||
|
||||
void init_sandbox_scene(LevelScene_t* scene)
|
||||
|
|
|
@ -45,7 +45,7 @@ static void level_scene_render_func(Scene_t* scene)
|
|||
EndTextureMode();
|
||||
}
|
||||
|
||||
static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed)
|
||||
static ActionResult level_do_action(Scene_t* scene, ActionType_t action, bool pressed)
|
||||
{
|
||||
CPlayerState_t* p_playerstate;
|
||||
sc_map_foreach_value(&scene->ent_manager.component_map[CPLAYERSTATE_T], p_playerstate)
|
||||
|
@ -96,6 +96,7 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed)
|
|||
break;
|
||||
}
|
||||
}
|
||||
return ACTION_PROPAGATE;
|
||||
}
|
||||
|
||||
static void render_regular_game_scene(Scene_t* scene)
|
||||
|
|
|
@ -34,7 +34,7 @@ static void exec_component_function(Scene_t* scene, int sel)
|
|||
}
|
||||
}
|
||||
|
||||
static void menu_do_action(Scene_t* scene, ActionType_t action, bool pressed)
|
||||
static ActionResult menu_do_action(Scene_t* scene, ActionType_t action, bool pressed)
|
||||
{
|
||||
MenuSceneData_t* data = &(CONTAINER_OF(scene, MenuScene_t, scene)->data);
|
||||
unsigned int new_selection = data->selected_comp;
|
||||
|
@ -83,6 +83,7 @@ static void menu_do_action(Scene_t* scene, ActionType_t action, bool pressed)
|
|||
exec_component_function(scene, data->selected_comp);
|
||||
}
|
||||
}
|
||||
return ACTION_PROPAGATE;
|
||||
}
|
||||
|
||||
static void gui_loop(Scene_t* scene)
|
||||
|
|
Loading…
Reference in New Issue