Remove backgrounds on screens. Have one shared background that persists across screens.

This commit is contained in:
Chris Danford
2004-12-09 08:16:18 +00:00
parent 08964e340b
commit b6d711b3c1
18 changed files with 92 additions and 93 deletions
+47 -27
View File
@@ -29,6 +29,7 @@
#include "RageTextureManager.h"
#include "ThemeManager.h"
#include "ScreenSystemLayer.h"
#include "BGAnimation.h"
ScreenManager* SCREENMAN = NULL; // global and accessable from anywhere in our program
@@ -50,6 +51,7 @@ void ScreenManager::Register( const CString& sClassName, CreateScreenFn pfn )
ScreenManager::ScreenManager()
{
m_pSharedBGA = new BGAnimation;
m_SystemLayer = NULL;
/* By the time this is constructed, THEME has already been set up and set to
@@ -60,7 +62,6 @@ ScreenManager::ScreenManager()
this->ThemeChanged();
m_ScreenBuffered = NULL;
m_MessageSendOnPop = SM_None;
}
@@ -71,7 +72,7 @@ ScreenManager::~ScreenManager()
EmptyDeleteQueue();
// delete current Screens
SAFE_DELETE( m_pSharedBGA );
for( unsigned i=0; i<m_ScreenStack.size(); i++ )
delete m_ScreenStack[i];
delete m_ScreenBuffered;
@@ -139,6 +140,8 @@ void ScreenManager::Update( float fDeltaTime )
*/
ASSERT( !m_ScreenStack.empty() || m_DelayedScreen != "" ); // Why play the game if there is nothing showing?
m_pSharedBGA->Update( fDeltaTime );
if( !m_ScreenStack.empty() )
{
Screen* pScreen = GetTopScreen();
@@ -149,7 +152,7 @@ void ScreenManager::Update( float fDeltaTime )
}
m_SystemLayer->Update( fDeltaTime );
EmptyDeleteQueue();
if(m_DelayedScreen.size() != 0)
@@ -180,13 +183,21 @@ void ScreenManager::Draw()
if( !DISPLAY->BeginFrame() )
return;
m_pSharedBGA->Draw();
if( !m_ScreenStack.empty() && !m_ScreenStack.back()->IsTransparent() ) // top screen isn't transparent
{
m_ScreenStack.back()->Draw();
}
else
{
for( unsigned i=0; i<m_ScreenStack.size(); i++ ) // Draw all screens bottom to top
m_ScreenStack[i]->Draw();
}
m_SystemLayer->Draw();
DISPLAY->EndFrame();
}
@@ -202,7 +213,7 @@ void ScreenManager::Input( const DeviceInput& DeviceI, const InputEventType type
}
Screen* ScreenManager::MakeNewScreen( const CString &sName )
Screen* ScreenManager::MakeNewScreen( const CString &sScreenName )
{
/* By default, RageSounds handles the song timer. When we change screens, reset this;
* screens turn this off in SM_GainFocus if they handle timers themselves (edit).
@@ -214,20 +225,20 @@ Screen* ScreenManager::MakeNewScreen( const CString &sName )
SONGMAN->Cleanup();
RageTimer t;
LOG->Trace( "Loading screen name '%s'", sName.c_str() );
LOG->Trace( "Loading screen name '%s'", sScreenName.c_str() );
CString sClassName = sName;
CString sClassName = sScreenName;
// Look up the class in the metrics group sName
if( THEME->HasMetric(sClassName,"Class") )
sClassName = THEME->GetMetric(sClassName,"Class");
map<CString,CreateScreenFn>::iterator iter = g_pmapRegistrees->find( sClassName );
ASSERT_M( iter != g_pmapRegistrees->end(), ssprintf("Screen '%s' has an invalid class '%s'",sName.c_str(),sClassName.c_str()) )
ASSERT_M( iter != g_pmapRegistrees->end(), ssprintf("Screen '%s' has an invalid class '%s'",sScreenName.c_str(),sClassName.c_str()) )
CreateScreenFn pfn = iter->second;
Screen* ret = pfn( sName );
Screen* ret = pfn( sScreenName );
LOG->Trace( "Loaded '%s' ('%s') in %f", sName.c_str(), sClassName.c_str(), t.GetDeltaTime());
LOG->Trace( "Loaded '%s' ('%s') in %f", sScreenName.c_str(), sClassName.c_str(), t.GetDeltaTime());
/* Loading probably took a little while. Let's reset stats. This prevents us
* from displaying an unnaturally low FPS value, and the next FPS value we
@@ -238,10 +249,10 @@ Screen* ScreenManager::MakeNewScreen( const CString &sName )
return ret;
}
void ScreenManager::PrepNewScreen( const CString &sClassName )
void ScreenManager::PrepNewScreen( const CString &sScreenName )
{
ASSERT(m_ScreenBuffered == NULL);
m_ScreenBuffered = MakeNewScreen(sClassName);
m_ScreenBuffered = MakeNewScreen(sScreenName);
}
void ScreenManager::LoadPreppedScreen()
@@ -255,6 +266,7 @@ void ScreenManager::LoadPreppedScreen()
void ScreenManager::DeletePreppedScreen()
{
SAFE_DELETE( m_ScreenBuffered );
TEXTUREMAN->DeleteCachedTextures();
}
@@ -285,9 +297,9 @@ void ScreenManager::SetFromNewScreen( Screen *pNewScreen, bool Stack )
PostMessageToTopScreen( SM_GainFocus, 0 );
}
void ScreenManager::SetNewScreen( const CString &sClassName )
void ScreenManager::SetNewScreen( const CString &sScreenName )
{
m_DelayedScreen = sClassName;
m_DelayedScreen = sScreenName;
/* If we're not delaying screen loads, load it now. Otherwise, we'll load
* it on the next iteration. Only delay if we already have a screen
@@ -299,7 +311,7 @@ void ScreenManager::SetNewScreen( const CString &sClassName )
void ScreenManager::LoadDelayedScreen()
{
retry:
CString sClassName = m_DelayedScreen;
CString sScreenName = m_DelayedScreen;
m_DelayedScreen = "";
/* If we prepped a screen but didn't use it, nuke it. */
@@ -307,10 +319,13 @@ retry:
Screen* pOldTopScreen = m_ScreenStack.empty() ? NULL : m_ScreenStack.back();
// It makes sense that ScreenManager should allocate memory for a new screen since it
// deletes it later on. This also convention will reduce includes because screens won't
// have to include each other's headers of other screens.
Screen* pNewScreen = MakeNewScreen(sClassName);
Screen* pNewScreen = MakeNewScreen(sScreenName);
if( pOldTopScreen!=NULL && m_ScreenStack.back()!=pOldTopScreen )
{
@@ -333,16 +348,16 @@ retry:
/* If this is a system menu, don't let the operator key touch it!
However, if you add an options screen, please include it here -- Miryokuteki */
if( sClassName == "ScreenOptionsMenu" ||
sClassName == "ScreenMachineOptions" ||
sClassName == "ScreenInputOptions" ||
sClassName == "ScreenGraphicOptions" ||
sClassName == "ScreenGameplayOptions" ||
sClassName == "ScreenMapControllers" ||
sClassName == "ScreenAppearanceOptions" ||
sClassName == "ScreenEdit" ||
sClassName == "ScreenEditMenu" ||
sClassName == "ScreenSoundOptions" )
if( sScreenName == "ScreenOptionsMenu" ||
sScreenName == "ScreenMachineOptions" ||
sScreenName == "ScreenInputOptions" ||
sScreenName == "ScreenGraphicOptions" ||
sScreenName == "ScreenGameplayOptions" ||
sScreenName == "ScreenMapControllers" ||
sScreenName == "ScreenAppearanceOptions" ||
sScreenName == "ScreenEdit" ||
sScreenName == "ScreenEditMenu" ||
sScreenName == "ScreenSoundOptions" )
GAMESTATE->m_bIsOnSystemMenu = true;
else
GAMESTATE->m_bIsOnSystemMenu = false;
@@ -355,14 +370,14 @@ retry:
SetFromNewScreen( pNewScreen, false );
}
void ScreenManager::AddNewScreenToTop( const CString &sClassName, ScreenMessage messageSendOnPop )
void ScreenManager::AddNewScreenToTop( const CString &sScreenName, ScreenMessage messageSendOnPop )
{
/* Send this before making the new screen, since it might set things that will be re-set
* in the new screen's ctor. */
if( m_ScreenStack.size() )
m_ScreenStack.back()->HandleScreenMessage( SM_LoseFocus );
Screen* pNewScreen = MakeNewScreen(sClassName);
Screen* pNewScreen = MakeNewScreen(sScreenName);
SetFromNewScreen( pNewScreen, true );
m_MessageSendOnPop = messageSendOnPop;
}
@@ -512,6 +527,11 @@ void ScreenManager::PlayBackSound()
m_soundBack.Play( &p );
}
void ScreenManager::PlaySharedBackgroundOffCommand()
{
m_pSharedBGA->PlayCommand("Off");
}
/*
* (c) 2001-2003 Chris Danford, Glenn Maynard
* All rights reserved.