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
49 void addGameObject(std::unique_ptr<GameObject>&& gameObject);
50 GameObject* createGameObject(const std::string& name);
51 GameObject* instantiate(const Prefab& prefab, const std::string& name = "");
52 void removeGameObject(GameObject* gameObject);
53 void removeGameObjectByName(const std::string& name);
54
55 template <typename T>
57 static_assert(std::is_base_of_v<System, T>, "必须继承自 System 基类");
58
59 auto type_index = std::type_index(typeid(T));
60
61 if (hasSystem<T>()) {
62 return getSystem<T>();
63 }
64
65 auto new_system = std::make_unique<T>();
66 T* new_system_ptr = new_system.get(); // 返回的指针
67
68 new_system_ptr->setScene(this);
69 new_system_ptr->init();
70
71 m_systemsMap[type_index] = std::unique_ptr<System>(new_system.release());
72 m_systems.push_back(new_system_ptr);
73 ST_CORE_TRACE("Scene : {} 已添加系统 {}", m_name, typeid(T).name());
74
75 m_isSystemsNeedSort = true;
76
77 return new_system_ptr;
78 }
79
80 template <typename T>
82 static_assert(std::is_base_of_v<System, T>, "必须继承自 System 基类");
83
84 m_pendingRemoveSystems.push_back(std::type_index(typeid(T))); // 延迟移除
85 }
86
87 template <typename T>
89 static_assert(std::is_base_of_v<System, T>, "必须继承自 System 基类");
90 auto type_index = std::type_index(typeid(T));
91
92 if (auto it = m_systemsMap.find(type_index); it != m_systemsMap.end()) {
93 return static_cast<T*>(it->second.get());
94 }
95 return nullptr;
96 }
97
98 template <typename T>
99 bool hasSystem() {
100 static_assert(std::is_base_of_v<System, T>, "必须继承自 System 基类");
101
102 return m_systemsMap.contains(std::type_index(typeid(T)));
103 }
104
105 // --- getter & setter ---
106 const std::string& getName() const { return m_name; }
107 std::vector<std::unique_ptr<GameObject>>& getGameObjects() { return m_gameObjects; }
108
109 void setName(const std::string& name) { m_name = name; }
110 private:
111 void processPendingAdditions(); // 处理延迟添加
112 void processPendingRemoveSystems();
113
114 std::string m_name; // 场景名称
115 std::vector<std::unique_ptr<GameObject>> m_gameObjects; // 游戏物体
116 std::vector<std::unique_ptr<GameObject>> m_pendingAdditions; // 延迟添加
117
118 std::unordered_map<std::type_index, std::unique_ptr<System>> m_systemsMap; // 注册的系统
119 std::vector<System*> m_systems; // 缓存的系统
120 std::vector<std::type_index> m_pendingRemoveSystems;
121 bool m_isSystemsNeedSort = false;
122 };
123}
#define SHIT_API
定义 Core.h:12
#define ST_CORE_TRACE(...)
定义 Log.h:48
行为基类 —— 用于编写自定义游戏逻辑
定义 Behavior.h:18
相机组件,定义"从哪个角度观察世界"
定义 CameraComponent.h:15
游戏物体类
定义 GameObject.h:22
预制体,可重复生成相同配置的 GameObject
定义 Prefab.h:21
渲染组件基类
定义 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:106
void removeGameObject(GameObject *gameObject)
按指针标记销毁
Scene(Scene &&)=delete
virtual void init()
注册默认系统(BehaviorSystem + RenderSystem)
void setName(const std::string &name)
定义 Scene.h:109
GameObject * createGameObject(const std::string &name)
创建并添加 GameObject
Scene(const Scene &)=delete
GameObject * instantiate(const Prefab &prefab, const std::string &name="")
从预制体实例化
T * getSystem()
定义 Scene.h:88
void unregisterSystem()
定义 Scene.h:81
void update()
更新所有 System + 处理延迟操作
T * registerSystem()
定义 Scene.h:56
std::vector< std::unique_ptr< GameObject > > & getGameObjects()
定义 Scene.h:107
bool hasSystem()
定义 Scene.h:99
virtual void destroy()
销毁所有对象与系统
Scene(const std::string &name)
Scene & operator=(Scene &&)=delete
场景管理器(单例)
定义 SceneManager.h:19
System 基类
定义 System.h:15
定义 AudioPlayer.h:9
@ T
定义 KeyCode.h:31