• Home
  • About
    • 게임 개발자 유정룡 photo

      게임 개발자 유정룡

      포트폴리오

    • Learn More
    • Email
    • Github
    • Bitbucket
  • Projects
    • All Projects
    • All Tags

DirectX11 공부 10일차(SceneManager)

10 Jun 2021

Reading time ~1 minute

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만 렌더링 되는 문제가 있다…

볓시간동안 했는데 아직 문제의 원인을 찾을 수 없다 ㅠㅠ 나중에 물어봐야 겠다.

으아아아 오늘은 날씨가 안좋아서 많이 못하겠다…. ㅠㅠ



DirectX Share Tweet +1