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;
}