示例#1
0
	void SceneManager::ExecuteSceneManagement ()
	{
		if (sceneMngParam == nullptr)
		{
			return;
		}

		Scene* scene;
		if (sceneMngParam->IsNext ())
		{
			delete rootScene;
			rootScene = nullptr;

			currentScene = SceneFactory::CreateScene (sceneMngParam->GetSceneId ());

			if (currentScene != nullptr)
			{
				currentScene->ProcessInitialize ();
				currentScene->ProcessBegin ();
			}
			
			rootScene = currentScene;
		}
		else if (sceneMngParam->IsAdd ())
		{
			currentScene = SceneFactory::CreateScene (sceneMngParam->GetSceneId ());
			currentScene->ProcessInitialize ();
			currentScene->ProcessBegin ();

			scene = rootScene;
			while (scene != nullptr
				&& scene->GetChild () != nullptr)
			{
				scene = scene->GetChild ();
			}

			scene->SetChild (currentScene);
		}
		else if (sceneMngParam->IsReplace ())
		{
			scene = rootScene->GetChild ();
			while (scene != nullptr
				&& scene->GetChild () != currentScene)
			{
				scene = scene->GetChild ();
			}

			if (scene != nullptr)
			{
				delete currentScene;
				currentScene = nullptr;

				currentScene = SceneFactory::CreateScene (sceneMngParam->GetSceneId ());
				currentScene->ProcessInitialize ();
				currentScene->ProcessBegin ();
				scene->SetChild (currentScene);
			}
		}
		else if (sceneMngParam->IsReturn ())
		{
			if (rootScene != currentScene)
			{
				scene = rootScene->GetChild ();

				// 子のポインタがcurrentSceneのポインタと一致するまで
				while (scene != nullptr
					&& scene != currentScene)
				{
					scene = scene->GetChild ();
					if (scene == nullptr)
					{
						break;
					}
				}

				if (scene != nullptr)
				{
					scene->DestroyChild ();
					currentScene = scene;
					scene->ProcessBegin ();
				}
			}
		}
		else if (sceneMngParam->IsReturnToRoot ())
		{
			scene = rootScene->GetChild ();
			delete scene;					// 子に関してはデストラクタで再帰
			rootScene->ProcessBegin ();
			currentScene = rootScene;
		}

		delete sceneMngParam;
		sceneMngParam = nullptr;
	}