more to implementation

This commit is contained in:
Glenn Maynard
2005-07-22 05:44:54 +00:00
parent 55c0f2b6f4
commit d41ba9480c
2 changed files with 43 additions and 43 deletions
+43 -38
View File
@@ -51,7 +51,12 @@ namespace
bool m_bDeleteWhenDone; bool m_bDeleteWhenDone;
ScreenMessage m_SendOnPop; ScreenMessage m_SendOnPop;
}; };
Actor *g_pSharedBGA; // BGA object that's persistent between screens
vector<LoadedScreen> g_ScreenStack; // bottommost to topmost vector<LoadedScreen> g_ScreenStack; // bottommost to topmost
vector<Screen*> g_OverlayScreens;
vector<Screen*> g_vPreparedScreens;
vector<Actor*> g_vPreparedBackgrounds;
}; };
void RegisterScreenClass( const CString& sClassName, CreateScreenFn pfn ) void RegisterScreenClass( const CString& sClassName, CreateScreenFn pfn )
@@ -68,7 +73,7 @@ void RegisterScreenClass( const CString& sClassName, CreateScreenFn pfn )
ScreenManager::ScreenManager() ScreenManager::ScreenManager()
{ {
m_pSharedBGA = new Actor; g_pSharedBGA = new Actor;
m_bZeroNextUpdate = false; m_bZeroNextUpdate = false;
m_PopTopScreen = SM_Invalid; m_PopTopScreen = SM_Invalid;
@@ -80,15 +85,15 @@ ScreenManager::~ScreenManager()
{ {
LOG->Trace( "ScreenManager::~ScreenManager()" ); LOG->Trace( "ScreenManager::~ScreenManager()" );
SAFE_DELETE( m_pSharedBGA ); SAFE_DELETE( g_pSharedBGA );
for( unsigned i=0; i<g_ScreenStack.size(); i++ ) for( unsigned i=0; i<g_ScreenStack.size(); i++ )
{ {
if( g_ScreenStack[i].m_bDeleteWhenDone ) if( g_ScreenStack[i].m_bDeleteWhenDone )
SAFE_DELETE( g_ScreenStack[i].m_pScreen ); SAFE_DELETE( g_ScreenStack[i].m_pScreen );
} }
DeletePreparedScreens(); DeletePreparedScreens();
for( unsigned i=0; i<m_OverlayScreens.size(); i++ ) for( unsigned i=0; i<g_OverlayScreens.size(); i++ )
SAFE_DELETE( m_OverlayScreens[i] ); SAFE_DELETE( g_OverlayScreens[i] );
} }
/* This is called when we start up, and when the theme changes or is reloaded. */ /* This is called when we start up, and when the theme changes or is reloaded. */
@@ -103,9 +108,9 @@ void ScreenManager::ThemeChanged()
m_soundScreenshot.Load( THEME->GetPathS("Common","screenshot") ); m_soundScreenshot.Load( THEME->GetPathS("Common","screenshot") );
// reload overlay screens // reload overlay screens
for( unsigned i=0; i<m_OverlayScreens.size(); i++ ) for( unsigned i=0; i<g_OverlayScreens.size(); i++ )
SAFE_DELETE( m_OverlayScreens[i] ); SAFE_DELETE( g_OverlayScreens[i] );
m_OverlayScreens.clear(); g_OverlayScreens.clear();
CString sOverlays = THEME->GetMetric( "Common","OverlayScreens" ); CString sOverlays = THEME->GetMetric( "Common","OverlayScreens" );
vector<CString> asOverlays; vector<CString> asOverlays;
@@ -113,7 +118,7 @@ void ScreenManager::ThemeChanged()
for( unsigned i=0; i<asOverlays.size(); i++ ) for( unsigned i=0; i<asOverlays.size(); i++ )
{ {
Screen *pScreen = MakeNewScreen( asOverlays[i] ); Screen *pScreen = MakeNewScreen( asOverlays[i] );
m_OverlayScreens.push_back( pScreen ); g_OverlayScreens.push_back( pScreen );
} }
this->RefreshCreditsMessages(); this->RefreshCreditsMessages();
@@ -197,10 +202,10 @@ void ScreenManager::Update( float fDeltaTime )
if( pScreen ) if( pScreen )
pScreen->Update( fDeltaTime ); pScreen->Update( fDeltaTime );
m_pSharedBGA->Update( fDeltaTime ); g_pSharedBGA->Update( fDeltaTime );
for( unsigned i=0; i<m_OverlayScreens.size(); i++ ) for( unsigned i=0; i<g_OverlayScreens.size(); i++ )
m_OverlayScreens[i]->Update( fDeltaTime ); g_OverlayScreens[i]->Update( fDeltaTime );
} }
// //
// Handle messages after updating. // Handle messages after updating.
@@ -209,10 +214,10 @@ void ScreenManager::Update( float fDeltaTime )
for( unsigned i=0; i<g_ScreenStack.size(); i++ ) for( unsigned i=0; i<g_ScreenStack.size(); i++ )
g_ScreenStack[i].m_pScreen->ProcessMessages( fDeltaTime ); g_ScreenStack[i].m_pScreen->ProcessMessages( fDeltaTime );
m_pSharedBGA->ProcessMessages( fDeltaTime ); g_pSharedBGA->ProcessMessages( fDeltaTime );
for( unsigned i=0; i<m_OverlayScreens.size(); i++ ) for( unsigned i=0; i<g_OverlayScreens.size(); i++ )
m_OverlayScreens[i]->ProcessMessages( fDeltaTime ); g_OverlayScreens[i]->ProcessMessages( fDeltaTime );
} }
/* The music may be started on the first update. If we're reading from a CD, /* The music may be started on the first update. If we're reading from a CD,
@@ -271,13 +276,13 @@ void ScreenManager::Draw()
if( !DISPLAY->BeginFrame() ) if( !DISPLAY->BeginFrame() )
return; return;
m_pSharedBGA->Draw(); g_pSharedBGA->Draw();
for( unsigned i=0; i<g_ScreenStack.size(); i++ ) // Draw all screens bottom to top for( unsigned i=0; i<g_ScreenStack.size(); i++ ) // Draw all screens bottom to top
g_ScreenStack[i].m_pScreen->Draw(); g_ScreenStack[i].m_pScreen->Draw();
for( unsigned i=0; i<m_OverlayScreens.size(); i++ ) for( unsigned i=0; i<g_OverlayScreens.size(); i++ )
m_OverlayScreens[i]->Draw(); g_OverlayScreens[i]->Draw();
DISPLAY->EndFrame(); DISPLAY->EndFrame();
@@ -293,9 +298,9 @@ void ScreenManager::Input( const DeviceInput& DeviceI, const InputEventType type
// true, it handled the input, so don't pass it further. OverlayInput could // true, it handled the input, so don't pass it further. OverlayInput could
// probably be merged with Input, but that would require changing all Input // probably be merged with Input, but that would require changing all Input
// overloads, as well as all MenuLeft, etc. overloads. // overloads, as well as all MenuLeft, etc. overloads.
for( unsigned i = 0; i < m_OverlayScreens.size(); ++i ) for( unsigned i = 0; i < g_OverlayScreens.size(); ++i )
{ {
Screen *pScreen = m_OverlayScreens[i]; Screen *pScreen = g_OverlayScreens[i];
if( pScreen->OverlayInput(DeviceI, type, GameI, MenuI, StyleI) ) if( pScreen->OverlayInput(DeviceI, type, GameI, MenuI, StyleI) )
return; return;
} }
@@ -333,9 +338,9 @@ Screen* ScreenManager::MakeNewScreen( const CString &sScreenName )
void ScreenManager::PrepareScreen( const CString &sScreenName ) void ScreenManager::PrepareScreen( const CString &sScreenName )
{ {
// If the screen is already prepared, stop. // If the screen is already prepared, stop.
for( int i = (int)m_vPreparedScreens.size()-1; i>=0; i-- ) for( int i = (int)g_vPreparedScreens.size()-1; i>=0; i-- )
{ {
Screen *&pScreen = m_vPreparedScreens[i]; Screen *&pScreen = g_vPreparedScreens[i];
if( pScreen->GetName() == sScreenName ) if( pScreen->GetName() == sScreenName )
return; return;
} }
@@ -345,7 +350,7 @@ void ScreenManager::PrepareScreen( const CString &sScreenName )
SONGMAN->Cleanup(); SONGMAN->Cleanup();
Screen* pNewScreen = MakeNewScreen(sScreenName); Screen* pNewScreen = MakeNewScreen(sScreenName);
m_vPreparedScreens.push_back( pNewScreen ); g_vPreparedScreens.push_back( pNewScreen );
/* Don't delete previously prepared versions of the screen's background, /* Don't delete previously prepared versions of the screen's background,
* and only prepare it if it's different than the current background * and only prepare it if it's different than the current background
@@ -354,10 +359,10 @@ void ScreenManager::PrepareScreen( const CString &sScreenName )
if( pNewScreen->UsesBackground() ) if( pNewScreen->UsesBackground() )
sNewBGA = THEME->GetPathB(sScreenName,"background"); sNewBGA = THEME->GetPathB(sScreenName,"background");
if( !sNewBGA.empty() && sNewBGA != m_pSharedBGA->GetName() ) if( !sNewBGA.empty() && sNewBGA != g_pSharedBGA->GetName() )
{ {
Actor *pNewBGA = NULL; Actor *pNewBGA = NULL;
FOREACH( Actor*, m_vPreparedBackgrounds, a ) FOREACH( Actor*, g_vPreparedBackgrounds, a )
{ {
if( (*a)->GetName() == sNewBGA ) if( (*a)->GetName() == sNewBGA )
{ {
@@ -372,7 +377,7 @@ void ScreenManager::PrepareScreen( const CString &sScreenName )
{ {
pNewBGA = ActorUtil::MakeActor( sNewBGA ); pNewBGA = ActorUtil::MakeActor( sNewBGA );
pNewBGA->SetName( sNewBGA ); pNewBGA->SetName( sNewBGA );
m_vPreparedBackgrounds.push_back( pNewBGA ); g_vPreparedBackgrounds.push_back( pNewBGA );
} }
} }
} }
@@ -394,12 +399,12 @@ bool ScreenManager::ConcurrentlyPrepareScreen( const CString &sScreenName, Scree
void ScreenManager::DeletePreparedScreens() void ScreenManager::DeletePreparedScreens()
{ {
FOREACH( Screen*, m_vPreparedScreens, s ) FOREACH( Screen*, g_vPreparedScreens, s )
SAFE_DELETE( *s ); SAFE_DELETE( *s );
m_vPreparedScreens.clear(); g_vPreparedScreens.clear();
FOREACH( Actor*, m_vPreparedBackgrounds, a ) FOREACH( Actor*, g_vPreparedBackgrounds, a )
SAFE_DELETE( *a ); SAFE_DELETE( *a );
m_vPreparedBackgrounds.clear(); g_vPreparedBackgrounds.clear();
TEXTUREMAN->DeleteCachedTextures(); TEXTUREMAN->DeleteCachedTextures();
} }
@@ -473,12 +478,12 @@ void ScreenManager::LoadDelayedScreen()
// Find the prepped screen. // Find the prepped screen.
// //
Screen* pNewScreen = NULL; Screen* pNewScreen = NULL;
FOREACH( Screen*, m_vPreparedScreens, s ) FOREACH( Screen*, g_vPreparedScreens, s )
{ {
if( (*s)->GetName() == sScreenName ) if( (*s)->GetName() == sScreenName )
{ {
pNewScreen = *s; pNewScreen = *s;
m_vPreparedScreens.erase( s ); g_vPreparedScreens.erase( s );
break; break;
} }
} }
@@ -501,28 +506,28 @@ void ScreenManager::LoadDelayedScreen()
CString sNewBGA; CString sNewBGA;
if( pNewScreen->UsesBackground() ) if( pNewScreen->UsesBackground() )
sNewBGA = THEME->GetPathB(sScreenName,"background"); sNewBGA = THEME->GetPathB(sScreenName,"background");
if( sNewBGA != m_pSharedBGA->GetName() ) if( sNewBGA != g_pSharedBGA->GetName() )
{ {
Actor *pNewBGA = NULL; Actor *pNewBGA = NULL;
if( sNewBGA.empty() ) if( sNewBGA.empty() )
pNewBGA = new Actor; pNewBGA = new Actor;
else else
{ {
FOREACH( Actor*, m_vPreparedBackgrounds, a ) FOREACH( Actor*, g_vPreparedBackgrounds, a )
{ {
if( (*a)->GetName() == sNewBGA ) if( (*a)->GetName() == sNewBGA )
{ {
pNewBGA = *a; pNewBGA = *a;
m_vPreparedBackgrounds.erase( a ); g_vPreparedBackgrounds.erase( a );
break; break;
} }
} }
} }
ASSERT( pNewBGA != NULL ); ASSERT( pNewBGA != NULL );
SAFE_DELETE( m_pSharedBGA ); SAFE_DELETE( g_pSharedBGA );
m_pSharedBGA = pNewBGA; g_pSharedBGA = pNewBGA;
m_pSharedBGA->PlayCommand( "On" ); g_pSharedBGA->PlayCommand( "On" );
} }
bool bIsOnSystemMenu = pNewScreen->GetScreenType() == system_menu; bool bIsOnSystemMenu = pNewScreen->GetScreenType() == system_menu;
@@ -653,7 +658,7 @@ void ScreenManager::PlayScreenshotSound()
void ScreenManager::PlaySharedBackgroundOffCommand() void ScreenManager::PlaySharedBackgroundOffCommand()
{ {
m_pSharedBGA->PlayCommand("Off"); g_pSharedBGA->PlayCommand("Off");
} }
// lua start // lua start
-5
View File
@@ -65,14 +65,9 @@ public:
void PlaySharedBackgroundOffCommand(); void PlaySharedBackgroundOffCommand();
void ZeroNextUpdate(); void ZeroNextUpdate();
private: private:
vector<Screen*> m_OverlayScreens;
Screen *m_pInputFocus; // NULL = top of m_ScreenStack Screen *m_pInputFocus; // NULL = top of m_ScreenStack
Actor *m_pSharedBGA; // BGA object that's persistent between screens
CString m_sSystemMessage; CString m_sSystemMessage;
vector<Screen*> m_vPreparedScreens;
vector<Actor*> m_vPreparedBackgrounds;
// Screen loads, removals, and concurrent prepares are delayed until the next update. // Screen loads, removals, and concurrent prepares are delayed until the next update.
CString m_sDelayedScreen; CString m_sDelayedScreen;