WIN32API FrameWork/원본

220504_WIN32API_Framework_5-1_SceneManager

hyrule 2022. 5. 8. 17:54

 

 

* Scene을 관리할 SceneManager 클래스를 싱글턴 패턴으로 미리 작성해놓은 매크로를 통해 선언한다. 하나의 SceneManager에서 Scene을 그때그때 바꿔 가며 실행할 것이다.

DECLARE_SINGLETON(CSceneManager)

 

 

 

* 실행되고 있는 Scene 주소를 담아놓을 포인터를 선언한다.

private:
	//씬매니저에서 씬 하나를 관리. 씬은 단 하나만 들고있을 예정.
	class CScene* m_Scene;

 

 

* 앞으로 모든 GameObject의 Update와 Render 함수 처리는 모두 SceneManager 클래스에서 시작한다.

bool CSceneManager::Init()
{
	//템플릿에 CMainScene을 넣어 CreateScene 함수를 통해 생성
	CreateScene<CMainScene>();

	return true;
}

bool CSceneManager::Update(float DeltaTime)
{
	m_Scene->Update(DeltaTime);

	//기본적으로 false를 반환해 주고,
    //update에서 씬을 바꾸는 상황이 생기면
    //true를 리턴해 줌으로써
    //update와 render을 일시 중지한다.
	return false;
}

void CSceneManager::Render(HDC hDC, float DeltaTime)
{
	m_Scene->Render(hDC, DeltaTime);
}

 

 

* CreateScene() 함수를 템플릿으로 선언하여 어떤 클래스던 생성할 수 있도록 해준다.

클래스 생성에 성공하면, 위에서 선언한 m_Scene 변수에 등록한다.

	template <typename T>
	bool CreateScene()
	{
		//씬 생성 및 초기화(실패시 False 반환)
		T* Scene = new T;
		if (!Scene->Init())
		{
			SAFE_DELETE(Scene);
			return false;
		}

		//씬 생성에 성공했으면 CSceneManager의 멤버변수 m_Scene에 업캐스팅을 통해 등록
		m_Scene = (CScene*)Scene;

		return true;
	}

 

 

 

 

 

 

 

<원본 코드>

//class CSceneManager
//SceneManager.h

#pragma once

#include "../SingletonMacro.h"
#include "../GameInfo.h"


class CSceneManager
{

private:
	//씬매니저에서 씬 하나를 관리. 씬은 단 하나만 들고있을 예정.
	class CScene* m_Scene;

public:
	bool Init();

	//반환타입을 bool로 하는 이유는 Scene이 교체되는지 아닌지를 
	//판단하기 위해서이다.
	bool Update(float DeltaTime);
	void Render(HDC hDC, float DeltaTime);

	template <typename T>
	bool CreateScene()
	{
		//씬 생성 및 초기화(실패시 False 반환)
		T* Scene = new T;
		if (!Scene->Init())
		{
			SAFE_DELETE(Scene);
			return false;
		}

		//씬 생성에 성공했으면 CSceneManager의 멤버변수 m_Scene에 업캐스팅을 통해 등록
		m_Scene = (CScene*)Scene;

		return true;
	}


	DECLARE_SINGLETON(CSceneManager)
};
//class CSceneManager
//SceneManager.cpp


#include "SceneManager.h"
#include "MainScene.h"

DEFINITION_SINGLETON(CSceneManager)

CSceneManager::CSceneManager():
	m_Scene(nullptr)
{

}

CSceneManager::~CSceneManager()
{
	SAFE_DELETE(m_Scene);
}

bool CSceneManager::Init()
{
	//템플릿에 CMainScene을 넣어 CreateScene 함수를 통해 생성
	CreateScene<CMainScene>();

	return true;
}



bool CSceneManager::Update(float DeltaTime)
{
	m_Scene->Update(DeltaTime);

	return false;
}

void CSceneManager::Render(HDC hDC, float DeltaTime)
{
	m_Scene->Render(hDC, DeltaTime);
}