ShitEngine
基于 C++20 与 SDL3 的轻量级 2D 游戏引擎
载入中...
搜索中...
未找到
Scene.h
浏览该文件的文档.
1#pragma once
2#include <typeindex>
3#include <vector>
4#include <memory>
5#include <unordered_map>
6#include <string>
7
8#include "../Core/Core.h"
11
12namespace Shit {
13 class System;
14 // 前向声明
15 class CameraComponent;
16 class SceneManager;
17 class GameObject;
18 class Prefab;
19 class Behavior;
21
35 public:
36 explicit Scene(const std::string& name);
38
39 // 禁止拷贝和移动构造
40 Scene(const Scene&) = delete;
41 Scene& operator=(const Scene&) = delete;
42 Scene(Scene&&) = delete;
43 Scene& operator=(Scene&&) = delete;
44
45 virtual void init();
46 void update();
47 virtual void destroy();
48
50 bool hasSystems() const { return !m_systems.empty(); }
51
52 void addGameObject(std::unique_ptr<GameObject>&& gameObject);
53 GameObject* createGameObject(const std::string& name);
54 GameObject* instantiate(const Prefab& prefab, const std::string& name = "");
55 void removeGameObject(GameObject* gameObject);
56 void removeGameObjectByName(const std::string& name);
57
59 bool registerComponent(Component* component);
62
63 template <typename T>
65 static_assert(std::is_base_of_v<System, T>, "必须继承自 System 基类");
66
67 auto type_index = std::type_index(typeid(T));
68
69 if (hasSystem<T>()) {
70 return getSystem<T>();
71 }
72
73 auto new_system = std::make_unique<T>();
74 T* new_system_ptr = new_system.get(); // 返回的指针
75
76 new_system_ptr->setScene(this);
77
78 // 先入表再 init():System::init() 会补扫场景中未注册的组件并广播 registerComponent。
79 // 若尚未加入 m_systems,新系统将收不到已存在组件的 onComponentAttached,
80 // "组件先加、驱动系统后注册"的补挂机制会失效。
81 m_systemsMap[type_index] = std::unique_ptr<System>(new_system.release());
82 m_systems.push_back(new_system_ptr);
83 m_isSystemsNeedSort = true;
84
85 new_system_ptr->init();
86
87 ST_CORE_TRACE("Scene : {} 已添加系统 {}", m_name, typeid(T).name());
88
89 return new_system_ptr;
90 }
91
92 template <typename T>
94 static_assert(std::is_base_of_v<System, T>, "必须继承自 System 基类");
95
96 m_pendingRemoveSystems.push_back(std::type_index(typeid(T))); // 延迟移除
97 }
98
99 template <typename T>
101 static_assert(std::is_base_of_v<System, T>, "必须继承自 System 基类");
102 auto type_index = std::type_index(typeid(T));
103
104 if (auto it = m_systemsMap.find(type_index); it != m_systemsMap.end()) {
105 return static_cast<T*>(it->second.get());
106 }
107 return nullptr;
108 }
109
110 template <typename T>
111 bool hasSystem() {
112 static_assert(std::is_base_of_v<System, T>, "必须继承自 System 基类");
113
114 return m_systemsMap.contains(std::type_index(typeid(T)));
115 }
116
117 // --- getter & setter ---
118 const std::string& getName() const { return m_name; }
119 std::vector<std::unique_ptr<GameObject>>& getGameObjects() { return m_gameObjects; }
120
121 void setName(const std::string& name) { m_name = name; }
122 private:
123 void processPendingAdditions(); // 处理延迟添加
124 void processPendingRemoveSystems();
125
126 std::string m_name; // 场景名称
127 std::vector<std::unique_ptr<GameObject>> m_gameObjects; // 游戏物体
128 std::vector<std::unique_ptr<GameObject>> m_pendingAdditions; // 延迟添加
129
130 std::unordered_map<std::type_index, std::unique_ptr<System>> m_systemsMap; // 注册的系统
131 std::vector<System*> m_systems; // 缓存的系统
132 std::vector<std::type_index> m_pendingRemoveSystems;
133 bool m_isSystemsNeedSort = false;
134 bool m_isInited = false;
135 };
136}
#define SHIT_API
定义 Core.h:14
#define ST_CORE_TRACE(...)
定义 Log.h:49
行为基类 —— 用于编写自定义游戏逻辑
定义 Behavior.h:18
相机组件,定义"从哪个角度观察世界"
定义 CameraComponent.h:16
组件基类
定义 Component.h:20
游戏物体类
定义 GameObject.h:23
预制体,可重复生成相同配置的 GameObject
定义 Prefab.h:22
渲染组件基类
定义 RendererComponent.h:18
void addGameObject(std::unique_ptr< GameObject > &&gameObject)
延迟添加 GameObject(帧末生效)
Scene & operator=(const Scene &)=delete
void removeGameObjectByName(const std::string &name)
按名称标记销毁
const std::string & getName() const
定义 Scene.h:118
void removeGameObject(GameObject *gameObject)
按指针标记销毁
void unregisterComponent(Component *component)
组件卸下广播(组件 onDetach 调用)。
bool hasSystems() const
是否已注册任何 System(SceneManager 用于自动初始化,防止漏调 init() 导致空场景)
定义 Scene.h:50
Scene(Scene &&)=delete
virtual void init()
注册默认系统(BehaviorSystem + RenderSystem + UIRenderSystem),幂等
void setName(const std::string &name)
定义 Scene.h:121
GameObject * createGameObject(const std::string &name)
创建并添加 GameObject
Scene(const Scene &)=delete
GameObject * instantiate(const Prefab &prefab, const std::string &name="")
从预制体实例化
T * getSystem()
定义 Scene.h:100
void unregisterSystem()
定义 Scene.h:93
void update()
更新所有 System + 处理延迟操作
T * registerSystem()
定义 Scene.h:64
std::vector< std::unique_ptr< GameObject > > & getGameObjects()
定义 Scene.h:119
bool hasSystem()
定义 Scene.h:111
virtual void destroy()
销毁所有对象与系统
Scene(const std::string &name)
Scene & operator=(Scene &&)=delete
bool registerComponent(Component *component)
组件挂载广播(组件 onAttach 调用)。分发给可处理的系统,返回是否有系统认领。
场景管理器(单例)
定义 SceneManager.h:19
System 基类
定义 System.h:15
定义 AudioPlayer.h:10
@ T
定义 KeyCode.h:31