diff LightClone/Source/ScreenManager.cpp @ 71:bc8afcf7e1ec

Refactor world into game screen
author koryspansel <koryspansel@bendbroadband.com>
date Tue, 11 Oct 2011 13:20:43 -0700
parents ffaeccdc105e
children 0574e2cf8bac
line wrap: on
line diff
--- a/LightClone/Source/ScreenManager.cpp	Tue Oct 11 12:09:04 2011 -0700
+++ b/LightClone/Source/ScreenManager.cpp	Tue Oct 11 13:20:43 2011 -0700
@@ -7,7 +7,7 @@
 /*
  * ScreenManager
  */
-ScreenManager::ScreenManager()
+ScreenManager::ScreenManager() : bDirty(false)
 {
 }
 
@@ -20,19 +20,20 @@
 
 	if(pInstance)
 	{
-		FixedString<> kName(pName);
-
-		Screen** pScreen = kScreens.Find(kName);
+		Screen** pScreen = kScreens.Find(pName);
+		
 		if(!pScreen)
-			pScreen = kScreens.Add(kName);
+		{
+			pScreen = kScreens.Add(pName);
+		}
 
 		if(pScreen)
 		{
 			(*pScreen) = pInstance;
-			(*pScreen)->SetScreenManager(this);
+			(*pScreen)->pScreenManager = this;
+
+			eCode = Error_Success;
 		}
-
-		eCode = Error_Success;
 	}
 
 	return eCode;
@@ -43,7 +44,17 @@
  */
 ErrorCode ScreenManager::Initialize(ServiceProvider* pServiceProvider)
 {
-	return Error_Success;
+	ErrorCode eCode = Error_Success;
+
+	ScreenMap::Iterator kScreen		= kScreens.Begin();
+	ScreenMap::Iterator kScreenEnd	= kScreens.End();
+
+	for(; kScreen != kScreenEnd && eCode == Error_Success; ++kScreen)
+	{
+		eCode = (*kScreen)->Initialize(pServiceProvider);
+	}
+
+	return eCode;
 }
 
 /*
@@ -51,6 +62,13 @@
  */
 void ScreenManager::Terminate()
 {
+	ScreenMap::Iterator kScreen		= kScreens.Begin();
+	ScreenMap::Iterator kScreenEnd	= kScreens.End();
+
+	for(; kScreen != kScreenEnd; ++kScreen)
+	{
+		(*kScreen)->Terminate();
+	}
 }
 
 /*
@@ -58,6 +76,12 @@
  */
 void ScreenManager::Update(float fElapsed)
 {
+	bDirty = false;
+
+	for(int32 i = kStack.Size() - 1; i >= 0 && !bDirty; --i)
+	{
+		kStack[i]->Update(fElapsed);
+	}
 }
 
 /*
@@ -65,4 +89,105 @@
  */
 void ScreenManager::Render(RenderContext& kContext)
 {
+	const int32 nSize = kStack.Size();
+
+	for(int32 i = 0; i < nSize; ++i)
+	{
+		kStack[i]->Render(kContext);
+	}
 }
+
+/*
+ * Set
+ */
+void ScreenManager::Set(const char* pName)
+{
+	while(kStack.Size() > 1)
+	{
+		Screen* pScreen = kStack.Pop();
+		ASSERT(pScreen != NULL);
+
+		pScreen->OnExit();
+
+		Screen* pTop = kStack.Peek();
+		ASSERT(pTop != NULL);
+
+		pTop->OnResume();
+	}
+
+	if(kStack.Size() > 0)
+	{
+		ASSERT(kStack.Size() == 1);
+
+		Screen* pScreen = kStack.Pop();
+		ASSERT(pScreen != NULL);
+
+		pScreen->OnExit();
+	}
+
+	Screen** pInstance = kScreens.Find(pName);
+	if(pInstance)
+	{
+		ASSERT(*pInstance != NULL);
+		(*pInstance)->OnEnter();
+
+		kStack.Push(*pInstance);
+	}
+
+	bDirty = true;
+}
+
+/*
+ * Push
+ */
+void ScreenManager::Push(const char* pName)
+{
+	Screen** pInstance = kScreens.Find(pName);
+	ASSERT(pInstance != NULL);
+
+	if(kStack.Size() > 0)
+	{
+		Screen* pTop = kStack.Peek();
+		ASSERT(pTop != NULL);
+
+		pTop->OnPause();
+	}
+
+	ASSERT(*pInstance != NULL);
+	(*pInstance)->OnEnter();
+
+	kStack.Push(*pInstance);
+
+	bDirty = true;
+}
+
+/*
+ * Pop
+ */
+void ScreenManager::Pop()
+{
+	ASSERT(kStack.Size() > 0);
+
+	Screen* pScreen = kStack.Pop();
+	ASSERT(pScreen != NULL);
+
+	pScreen->OnExit();
+
+	if(kStack.Size() > 0)
+	{
+		Screen* pTop = kStack.Peek();
+		ASSERT(pTop != NULL);
+
+		pTop->OnResume();
+	}
+
+	bDirty = true;
+}
+
+/*
+ * IsActive
+ */
+bool ScreenManager::IsActive() const
+{
+	return kStack.Size() > 0;
+}
\ No newline at end of file