SceneManager
유니티에서 씬, 언리얼에서 레벨 을 관리해주는 매니져이다.
일단 지금까지 썼던 Execute 클래스를 Scene클래스로 이름을 변경해주자
SceneManager.h
#pragma once
#include "Scene/Scene.h"
#include "Scene/Scene2.h"
class SceneManager final
{
public:
SceneManager();
~SceneManager();
bool Initaialize();
const std::map<std::string, std::shared_ptr<class Scene>>& GetAllScenes() const { return scenes; }
Scene* GetCurrentScene();
void SetCurrentScene(const std::string& scene_name);
class Scene* const RegisterScene(const std::string& scene_name);
void Update();
void Render();
private:
std::weak_ptr<Scene> current_scene;
std::map<std::string, std::shared_ptr<class Scene>> scenes;
};
current_scene은 shared_ptr로 할 경우 밑에 맵과 순환참조를 할 수도 있기 때문에 week_ptr로 선언
그리고 scene 자료구조를 벡터가 아닌 map으로 만든다.
SceneManager.cpp
#include "stdafx.h"
#include "SceneManager.h"
SceneManager::SceneManager()
{
}
SceneManager::~SceneManager()
{
}
bool SceneManager::Initaialize()
{
RegisterScene("First");
SetCurrentScene("First");
return true;
}
Scene* SceneManager::GetCurrentScene()
{
return current_scene.expired() ? nullptr : current_scene.lock().get();
}
void SceneManager::SetCurrentScene(const std::string& scene_name)
{
if (scenes.find(scene_name) == scenes.end())
{
assert(false);
}
current_scene = scenes[scene_name];
}
Scene* const SceneManager::RegisterScene(const std::string& scene_name)
{
if (scenes.find(scene_name) != scenes.end())
{
assert(false);
}
std::shared_ptr<Scene> new_scene = std::make_shared<Scene>();
scenes[scene_name] = new_scene;
return scenes[scene_name].get();
}
void SceneManager::Update()
{
if (!current_scene.expired())
{
current_scene.lock()->Update();
}
}
void SceneManager::Render()
{
if (!current_scene.expired())
{
current_scene.lock()->Render();
}
}
이제 map에 넣어주고 현재의 씬을 반환하거나 바꿔주는 역할을 하는 함수를 만든다.
이렇게 하고 Program.cpp에서
std::unique_ptr<SceneManager> scene_manager = std::make_unique<SceneManager>();
scene_manager->Initaialize();
while (Window::Update())
{
scene_manager->Update();
scene_manager->Render();
}
이렇게 해면
원래 하던 그림이 나온다.
그런데 문제가 있다
똑같은 Scene클래스를 사용해서 2개의 Scene을 만든뒤 두개를 전환하면
나중에 만든 Scene만 렌더링 되는 문제가 있다…
볓시간동안 했는데 아직 문제의 원인을 찾을 수 없다 ㅠㅠ 나중에 물어봐야 겠다.
으아아아 오늘은 날씨가 안좋아서 많이 못하겠다…. ㅠㅠ