more to implementation
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user