* 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);
}
'WIN32API FrameWork > 원본' 카테고리의 다른 글
220504_WIN32API_Framework_5-3_실제 Scene 만들고 실행(MainScene) (0) | 2022.05.08 |
---|---|
220504_WIN32API_Framework_5-2_Class Scene (0) | 2022.05.08 |
220504_WIN32API_Framework_4_스마트 포인터(참조 카운트) (0) | 2022.05.06 |
220503_WIN32API_3-3_조작에 따라 회전하는 총 만들기(삼각함수) (0) | 2022.05.05 |
220503_WIN32API_Framework_3-2_입력받은대로 캐릭터 이동 (0) | 2022.05.05 |