
게임프레임워크에서 가장 큰 단위는 장면, Scene이다. Scene 클래스는 Layer List를 가지고 있고 Layer은 Object List를 가지고 있다. 그래서 Scene의 Update 함수는 Layer List의 Layer들을 모두 업데이트 해주고, Layer의 Update는 Object List의 Object들을 모두 업데이트 해준다.
Layer은 ZOrder라는 변수를 가지는데 레이어를 생성할 때마다 자동으로 ZOrder의 오름차순으로 정렬한다. 그래서 ZOrder가 낮은 레이어에 있는 Object들은 먼저 출력되고 높은 레이어에 있는 Object들은 나중에 출력된다. 배경은 낮은 레이어에 출력하고 UI는 높은 레이어에 출력해서 Render 순서를 조정할 수 있다. 그외에도 Layer은 Enable과 Life라는 bool 변수를 가지는데 Enable이 false라면 Update나 Render같은 처리에 포함되지 않고 Life가 false라면 레이어를 지워버린다.
template<typename T>
T* CreateScene(SCENE_CREATE sc = SC_CURRENT)
{
T* pScene = new T;
pScene->SetSceneType(sc);
if (!pScene->Init())
{
SAFE_DELETE(pScene);
return NULL;
}
switch (sc)
{
case SC_CURRENT:
SAFE_DELETE(m_pScene);
m_pScene = pScene;
break;
case SC_NEXT:
SAFE_DELETE(m_pNextScene);
m_pNextScene = pScene;
break;
}
return pScene;
}
SceneManager클래스는 Scene들을 관리한다. 그리고 m_pScene이라는 현재 Scene객체와 m_pNextScene이라는 다음 Scene 객체를 가지고 있다. CreateScene은 Scene을 상속받는 자식 클래스를 타입으로 받아 새로운 Scene을 생성하는 함수 템플릿이다. 새로운 Scene은 SC_CURRENT, SC_NEXT 두가지 타입으로 생성할 수 있다.
SCENE_CHANGE CSceneManager::ChangeScene()
{
if (m_pNextScene)
{
SAFE_DELETE(m_pScene);
m_pScene = m_pNextScene;
m_pNextScene = NULL;
GET_SINGLE(CCollisionManager)->Clear();
m_pScene->SetSceneType(SC_CURRENT);
CScene::ChangePrototype();
return SC_CHANGE;
}
return SC_NONE;
}
ChangeScene은 장면을 전환하는 함수이다. m_pNextScene이 Null이 아니라면 기존의 m_pScene을 m_pNextScene으로 바꿔준다. 그리고 충돌체 리스트를 비우고 프로토타입들을 바꿀 Scene의 프로토타입으로 바꾼다. 그래서 장면이 없는 경우라면 CreateScene에서 SC_CURRENT로 Scene을 생성하고 현재 장면이 있고 장면을 다른 장면으로 전환하고 싶다면 SC_NEXT로 Scene을 생성한다.
'WinAPI' 카테고리의 다른 글
| [WinAPI] 게임 프레임워크 - 4. Input (0) | 2022.02.02 |
|---|---|
| [WinAPI] 게임 프레임워크 - 3. Reference Count (0) | 2022.02.01 |
| [Winapi] 게임 프레임워크 - 1. Core (0) | 2022.02.01 |
| [WinAPI] Pivot (0) | 2022.01.20 |
| [WinAPI] 더블 버퍼링 (0) | 2022.01.20 |