7 분 소요

🔷 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들의 렌더링명령이 명령목록에 추가되어 그려진다.
}


📑. 참고

카테고리:

업데이트:

댓글남기기