ProjectTextRPG/TextRPG/Source/Core/Subsystems/SceneManager.h

47 lines
1.0 KiB
C++

#pragma once
#include "Core/Scene/CoreScene.h"
#define CLASS_TO_NAME(Type) #Type
class GameSceneManager
{
public:
GameSceneManager();
virtual ~GameSceneManager();
void Initialize();
void Update();
void Release();
template<typename... Scenes>
void CreateScenes();
template<typename Scene>
void TransitionTo();
private:
std::map<std::string, CoreScene*> SceneElements;
CoreScene* CurrentScene;
};
template<typename ...Scenes>
inline void GameSceneManager::CreateScenes()
{
static_assert((std::is_base_of_v<CoreScene, Scenes> && ...), "반드시 CoreScene 클래스 이거나 상속받아야 함");
(SceneElements.emplace(typeid(Scenes).name(), new Scenes(this)),...);
}
template<typename Scene>
inline void GameSceneManager::TransitionTo()
{
static_assert((std::is_base_of_v<CoreScene, Scene>), "반드시 CoreScene 클래스 이거나 상속받아야 함");
std::string ClassName = typeid(Scene).name();
auto Found = SceneElements.find(ClassName);
if (Found != SceneElements.end())
{
CurrentScene = Found->second;
CurrentScene->Enter();
}
}