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
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>
56
T
*
registerSystem
() {
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>
81
void
unregisterSystem
() {
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>
88
T
*
getSystem
() {
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
}
Core.h
SHIT_API
#define SHIT_API
定义
Core.h:12
Log.h
ST_CORE_TRACE
#define ST_CORE_TRACE(...)
定义
Log.h:48
System.h
Shit::Behavior
行为基类 —— 用于编写自定义游戏逻辑
定义
Behavior.h:18
Shit::CameraComponent
相机组件,定义"从哪个角度观察世界"
定义
CameraComponent.h:15
Shit::GameObject
游戏物体类
定义
GameObject.h:22
Shit::Prefab
预制体,可重复生成相同配置的 GameObject
定义
Prefab.h:21
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:106
Shit::Scene::removeGameObject
void removeGameObject(GameObject *gameObject)
按指针标记销毁
Shit::Scene::Scene
Scene(Scene &&)=delete
Shit::Scene::init
virtual void init()
注册默认系统(BehaviorSystem + RenderSystem)
Shit::Scene::setName
void setName(const std::string &name)
定义
Scene.h:109
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:88
Shit::Scene::unregisterSystem
void unregisterSystem()
定义
Scene.h:81
Shit::Scene::update
void update()
更新所有 System + 处理延迟操作
Shit::Scene::registerSystem
T * registerSystem()
定义
Scene.h:56
Shit::Scene::getGameObjects
std::vector< std::unique_ptr< GameObject > > & getGameObjects()
定义
Scene.h:107
Shit::Scene::hasSystem
bool hasSystem()
定义
Scene.h:99
Shit::Scene::destroy
virtual void destroy()
销毁所有对象与系统
Shit::Scene::Scene
Scene(const std::string &name)
Shit::Scene::operator=
Scene & operator=(Scene &&)=delete
Shit::SceneManager
场景管理器(单例)
定义
SceneManager.h:19
Shit::System
System 基类
定义
System.h:15
Shit
定义
AudioPlayer.h:9
Shit::KeyCode::T
@ T
定义
KeyCode.h:31
ShitEngine
Scene
Scene.h
制作者
1.17.0