17. Scene을 통한 최종 출력
*** 공부 방법 ***
1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처
hyrule.tistory.com
CSceneManager::Update();
CGameManager::Update();
CSceneManager::Render();
CGameManager::Render();
- 시작하기에 앞서 CGameManager에서 동적할당했던 CPlayer 관련 코드는 전부 지워준다.
- 지난번에 CScene 클래스에서 게임오브젝트들에 대한 Update()와 Render() 메소드는 다 구현했다.
이제 이 메소드들을 동작시킬 차례이다.
- CSceneManager 클래스에서는 들고있는 m_Scene의 주소로 타고 들어가 구현했던 Update()와 Render() 메소드를 호출한다.
- 또한, CSceneManager::Update() 메소드를 bool타입으로 바꿔 준다.
예를 들어 캐릭터 선택 씬이 있다고 가정해보자.
만약 우리가 캐릭터선택을 완료해서 씬이 넘어가면, 해당 씬은 더이상 Render()해줄 필요가 없기 때문이다.
만약 씬이 전환되면, true를 return해서, 게임매니저에서 진행중인 Logic()메소드를 중단시킨다.
//CSceneManager.cpp
bool CSceneManager::Update(float DeltaTime)
{
m_Scene->Update(DeltaTime);
return false;
}
void CSceneManager::Render(HDC hDC, float DeltaTime)
{
m_Scene->Render(hDC, DeltaTime);
}
- CGameManager 클래스에서는 CSceneManager의 싱글턴 객체를 생성한다.
bool CGameManager::Init(HINSTANCE hInstance)
{
//
//기존 코드
//
if (!CSceneManager::GetInst()->Init())
return false;
return true;
}
- Update()메소드를 bool 타입을 반환하도록 바꿔 준다.
- 안에서는 bool SceneManager::Update()의 결과를 반환받고, 그 결과를 그대로 다시 반환한다.
- CGameManager 클래스의 Update()와 Render() 메소드에서는 각각 CSceneManager의 Update()와 Render() 메소드를 호출해 준다. 계속 아래로 타고들어가면서 호출하는 것이다.
bool CGameManager::Update(float DeltaTime)
{
return CSceneManager::GetInst()->Update(DeltaTime);
}
void CGameManager::Render(HDC hDC, float DeltaTime)
{
//기존 코드
CSceneManager::GetInst()->Render(hDC, DeltaTime);
}
- 이제 Logic 메소드에서 Update를 실행 중에 true가 반환되면, return 해줌으로써 처음부터 다시 시작한다.
void CGameManager::Logic()
{
// 타이머를 갱신하여 델타임 및 FPS 를 구한다.
m_Timer->Update();
float DeltaTime = m_Timer->GetDeltaTime();
Input(DeltaTime);
// Scene이 교체될 경우 처음부터 다시 동작시킨다.
if (Update(DeltaTime))
return;
Collision(DeltaTime);
Render(DeltaTime);
}
이제 기본적인 씬 구조 구현은 완료되었다.
게임오브젝트를 실행하는 과정은 간단하다.
실행시킬 씬(지금은 CMainScene)초기화 메소드에서 CreateObject<T>() 메소드를 호출해준다.
bool CMainScene::Init()
{
CreateObject<CPlayer>("Player");
return true;
}
그리고 CSceneManager에서 CMainScene을 불러오면,
자동으로 CPlayer 게임오브젝트가 생성되게 된다.
bool CSceneManager::Init()
{
CreateScene<CMainScene>();
return true;
}
< Scene 구현 결과 >
겉보기로 달라진건 없지만, 리소스 관리가 한결 편해졌다.