[DirectX12] 📂. Scene
🔷 Scene
1. Scene Class
- 여러 GameObject를 포함하는 클래스
class Scene
{
...
private:
vector<shared_ptr<GameObject>> _gameObjects;
};
2. SceneManager Class
- 현재 활성화되어 있는(화면에 보여지는) Scene을 관리하는 클래스
- 활성화된 scene이 포함하는 모든 gameObject들을 렌더링한다.
class SceneManager
{
public:
void Update();
void LoadScene(wstring sceneName);
...
private:
shared_ptr<Scene> _activeScene;
};
void SceneManager::Update()
{
if (_activeScene == nullptr)
return;
_activeScene->Update();
_activeScene->LateUpdate();
}
void SceneManager::LoadScene(wstring sceneName)
{
// TODO : 기존 Scene 정리
// TODO : 파일에서 Scene 정보 로드
_activeScene = LoadTestScene();
_activeScene->Awake();
_activeScene->Start();
}
🔷 SceneManager를 사용한 렌더링 흐름
1) game을 최기화 한 후, 매 프레임마다 game이 Update된다.
unique_ptr<Game> game = make_unique<Game>();
game->Init(windowInfo);
while (true)
{
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
// TODO
game->Update();
}
2) Game::Init() 할 때, 테스트용 SceneManager를 등록해 놓았으며, Game::Update() 될 때 마다 Engine::Update()를 호출한다.
void Game::Init(WindowInfo& window)
{
MyEngine->Init(window);
SceneManager::GetInstance()->LoadScene(L"TestScene");
}
void Game::Update()
{
MyEngine->Update();
}
3) Engine::Update()가 Engine::Render()를 호출한다.
void Engine::Update()
{
Render();
}
4) Engine::Render()에선 렌더링을 위한 전·후처리와 SceneManager를 Update시켜준다.
void Engine::Render()
{
Start();
SceneManager::GetInstance()->Update();
End();
}
5) SceneManager::Update()를 통해 활성화 된 Scene을 Update시켜준다.
void SceneManager::Update()
{
if (_activeScene == nullptr)
return;
_activeScene->Update();
}
6) Scene::Update()에서 Scene에 포함되어있는 모든 gameObject들을 Update시킨다.
void Scene::Update()
{
for (shared_ptr<GameObject> gameObject : _gameObjects)
gameObject->Update(); // gameObject들의 렌더링명령이 명령목록에 추가되어 그려진다.
}
댓글남기기