ShitEngine
基于 C++20 与 SDL3 的轻量级 2D 游戏引擎
Toggle main menu visibility
载入中...
搜索中...
未找到
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
"
9
#include "
ShitEngine/Core/Log.h
"
10
#include "
ShitEngine/System/System.h
"
11
12
namespace
Shit
{
13
class
System
;
14
// 前向声明
15
class
CameraComponent
;
16
class
SceneManager
;
17
class
GameObject
;
18
class
Prefab
;
19
class
Behavior
;
20
class
RendererComponent
;
21
34
class
SHIT_API
Scene
{
35
public
:
36
explicit
Scene
(
const
std::string& name);
37
~Scene
();
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);
61
void
unregisterComponent
(
Component
* component);
62
63
template
<
typename
T>
64
T
*
registerSystem
() {
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>
93
void
unregisterSystem
() {
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>
100
T
*
getSystem
() {
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
}
Core.h
SHIT_API
#define SHIT_API
定义
Core.h:14
Log.h
ST_CORE_TRACE
#define ST_CORE_TRACE(...)
定义
Log.h:49
System.h
Shit::Behavior
行为基类 —— 用于编写自定义游戏逻辑
定义
Behavior.h:18
Shit::CameraComponent
相机组件,定义"从哪个角度观察世界"
定义
CameraComponent.h:16
Shit::Component
组件基类
定义
Component.h:20
Shit::GameObject
游戏物体类
定义
GameObject.h:23
Shit::Prefab
预制体,可重复生成相同配置的 GameObject
定义
Prefab.h:22
Shit::RendererComponent
渲染组件基类
定义
RendererComponent.h:18
Shit::Scene::addGameObject
void addGameObject(std::unique_ptr< GameObject > &&gameObject)
延迟添加 GameObject(帧末生效)
Shit::Scene::operator=
Scene & operator=(const Scene &)=delete
Shit::Scene::~Scene
~Scene()
Shit::Scene::removeGameObjectByName
void removeGameObjectByName(const std::string &name)
按名称标记销毁
Shit::Scene::getName
const std::string & getName() const
定义
Scene.h:118
Shit::Scene::removeGameObject
void removeGameObject(GameObject *gameObject)
按指针标记销毁
Shit::Scene::unregisterComponent
void unregisterComponent(Component *component)
组件卸下广播(组件 onDetach 调用)。
Shit::Scene::hasSystems
bool hasSystems() const
是否已注册任何 System(SceneManager 用于自动初始化,防止漏调 init() 导致空场景)
定义
Scene.h:50
Shit::Scene::Scene
Scene(Scene &&)=delete
Shit::Scene::init
virtual void init()
注册默认系统(BehaviorSystem + RenderSystem + UIRenderSystem),幂等
Shit::Scene::setName
void setName(const std::string &name)
定义
Scene.h:121
Shit::Scene::createGameObject
GameObject * createGameObject(const std::string &name)
创建并添加 GameObject
Shit::Scene::Scene
Scene(const Scene &)=delete
Shit::Scene::instantiate
GameObject * instantiate(const Prefab &prefab, const std::string &name="")
从预制体实例化
Shit::Scene::getSystem
T * getSystem()
定义
Scene.h:100
Shit::Scene::unregisterSystem
void unregisterSystem()
定义
Scene.h:93
Shit::Scene::update
void update()
更新所有 System + 处理延迟操作
Shit::Scene::registerSystem
T * registerSystem()
定义
Scene.h:64
Shit::Scene::getGameObjects
std::vector< std::unique_ptr< GameObject > > & getGameObjects()
定义
Scene.h:119
Shit::Scene::hasSystem
bool hasSystem()
定义
Scene.h:111
Shit::Scene::destroy
virtual void destroy()
销毁所有对象与系统
Shit::Scene::Scene
Scene(const std::string &name)
Shit::Scene::operator=
Scene & operator=(Scene &&)=delete
Shit::Scene::registerComponent
bool registerComponent(Component *component)
组件挂载广播(组件 onAttach 调用)。分发给可处理的系统,返回是否有系统认领。
Shit::SceneManager
场景管理器(单例)
定义
SceneManager.h:19
Shit::System
System 基类
定义
System.h:15
Shit
定义
AudioPlayer.h:10
Shit::KeyCode::T
@ T
定义
KeyCode.h:31
include
ShitEngine
Scene
Scene.h
制作者
1.17.0