Mercurial > LightClone
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