zero the next update after creating or deleting a screen so we don't skip

This commit is contained in:
Chris Danford
2005-02-05 22:11:15 +00:00
parent d1a701a9a9
commit 33661c13d6
2 changed files with 26 additions and 3 deletions
+20 -1
View File
@@ -57,6 +57,8 @@ ScreenManager::ScreenManager()
m_MessageSendOnPop = SM_None; m_MessageSendOnPop = SM_None;
m_bZeroNextUpdate = false;
/* By the time this is constructed, THEME has already been set up and set to /* By the time this is constructed, THEME has already been set up and set to
* the current theme. Call ThemeChanged(), to handle the starting theme * the current theme. Call ThemeChanged(), to handle the starting theme
* and set up m_SystemLayer. */ * and set up m_SystemLayer. */
@@ -104,6 +106,8 @@ void ScreenManager::EmptyDeleteQueue()
if(!m_vScreensToDelete.size()) if(!m_vScreensToDelete.size())
return; return;
m_bZeroNextUpdate = true;
for( unsigned i=0; i<m_vScreensToDelete.size(); i++ ) for( unsigned i=0; i<m_vScreensToDelete.size(); i++ )
SAFE_DELETE( m_vScreensToDelete[i] ); SAFE_DELETE( m_vScreensToDelete[i] );
@@ -146,8 +150,12 @@ void ScreenManager::Update( float fDeltaTime )
/* Loading a new screen can take seconds and cause a big jump on the new /* Loading a new screen can take seconds and cause a big jump on the new
* Screen's first update. Clamp the first update delta so that the * Screen's first update. Clamp the first update delta so that the
* animations don't jump. */ * animations don't jump. */
if( pScreen && pScreen->IsFirstUpdate() ) if( pScreen && m_bZeroNextUpdate )
{
LOG->Trace( "Zeroing this update. Was %f", fDeltaTime );
fDeltaTime = 0; fDeltaTime = 0;
m_bZeroNextUpdate = false;
}
if( pScreen ) if( pScreen )
pScreen->Update( fDeltaTime ); pScreen->Update( fDeltaTime );
@@ -156,6 +164,7 @@ void ScreenManager::Update( float fDeltaTime )
m_SystemLayer->Update( fDeltaTime ); m_SystemLayer->Update( fDeltaTime );
EmptyDeleteQueue(); EmptyDeleteQueue();
if(m_sDelayedScreen.size() != 0) if(m_sDelayedScreen.size() != 0)
@@ -218,6 +227,8 @@ void ScreenManager::Input( const DeviceInput& DeviceI, const InputEventType type
Screen* ScreenManager::MakeNewScreen( const CString &sScreenName ) Screen* ScreenManager::MakeNewScreen( const CString &sScreenName )
{ {
m_bZeroNextUpdate = true;
/* By default, RageSounds handles the song timer. When we change screens, reset this; /* 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). * screens turn this off in SM_GainFocus if they handle timers themselves (edit).
* XXX: screens should turn this on in SM_LoseFocus if they handle timers themselves, too */ * XXX: screens should turn this on in SM_LoseFocus if they handle timers themselves, too */
@@ -251,6 +262,8 @@ Screen* ScreenManager::MakeNewScreen( const CString &sScreenName )
void ScreenManager::PrepareScreen( const CString &sScreenName ) void ScreenManager::PrepareScreen( const CString &sScreenName )
{ {
m_bZeroNextUpdate = true;
// Delete previously prepared versions of the screen. // Delete previously prepared versions of the screen.
FOREACH( Screen*, m_vPreparedScreens, s ) FOREACH( Screen*, m_vPreparedScreens, s )
{ {
@@ -266,6 +279,8 @@ void ScreenManager::PrepareScreen( const CString &sScreenName )
void ScreenManager::DeletePreparedScreens() void ScreenManager::DeletePreparedScreens()
{ {
m_bZeroNextUpdate = true;
FOREACH( Screen*, m_vPreparedScreens, s ) FOREACH( Screen*, m_vPreparedScreens, s )
SAFE_DELETE( *s ); SAFE_DELETE( *s );
m_vPreparedScreens.clear(); m_vPreparedScreens.clear();
@@ -314,6 +329,8 @@ void ScreenManager::SetNewScreen( const CString &sScreenName )
void ScreenManager::LoadDelayedScreen() void ScreenManager::LoadDelayedScreen()
{ {
m_bZeroNextUpdate = true;
retry: retry:
CString sScreenName = m_sDelayedScreen; CString sScreenName = m_sDelayedScreen;
m_sDelayedScreen = ""; m_sDelayedScreen = "";
@@ -408,6 +425,8 @@ retry:
void ScreenManager::AddNewScreenToTop( const CString &sScreenName, ScreenMessage messageSendOnPop ) void ScreenManager::AddNewScreenToTop( const CString &sScreenName, ScreenMessage messageSendOnPop )
{ {
m_bZeroNextUpdate = true;
/* Send this before making the new screen, since it might set things that will be re-set /* Send this before making the new screen, since it might set things that will be re-set
* in the new screen's ctor. */ * in the new screen's ctor. */
if( m_ScreenStack.size() ) if( m_ScreenStack.size() )
+4
View File
@@ -72,6 +72,10 @@ private:
vector<Screen*> m_vPreparedScreens; vector<Screen*> m_vPreparedScreens;
vector<Screen*> m_vScreensToDelete; vector<Screen*> m_vScreensToDelete;
// Set this to true anywhere we create of delete objects. These
// operations take a long time, and will cause a skip on the next update.
bool m_bZeroNextUpdate;
Screen* MakeNewScreen( const CString &sName ); Screen* MakeNewScreen( const CString &sName );
void SetFromNewScreen( Screen *pNewScreen, bool Stack ); void SetFromNewScreen( Screen *pNewScreen, bool Stack );
void ClearScreenStack(); void ClearScreenStack();