Mercurial > LightClone
view 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 source
/* * ScreenManager */ #include "ScreenManager.h" /* * ScreenManager */ ScreenManager::ScreenManager() : bDirty(false) { } /* * Register */ ErrorCode ScreenManager::Register(const char* pName, Screen* pInstance) { ErrorCode eCode = Error_Fail; if(pInstance) { Screen** pScreen = kScreens.Find(pName); if(!pScreen) { pScreen = kScreens.Add(pName); } if(pScreen) { (*pScreen) = pInstance; (*pScreen)->pScreenManager = this; eCode = Error_Success; } } return eCode; } /* * Initialize */ ErrorCode ScreenManager::Initialize(ServiceProvider* pServiceProvider) { 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; } /* * Terminate */ void ScreenManager::Terminate() { ScreenMap::Iterator kScreen = kScreens.Begin(); ScreenMap::Iterator kScreenEnd = kScreens.End(); for(; kScreen != kScreenEnd; ++kScreen) { (*kScreen)->Terminate(); } } /* * Update */ void ScreenManager::Update(float fElapsed) { bDirty = false; for(int32 i = kStack.Size() - 1; i >= 0 && !bDirty; --i) { kStack[i]->Update(fElapsed); } } /* * Render */ 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; }