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
+22 -3
View File
@@ -57,6 +57,8 @@ ScreenManager::ScreenManager()
m_MessageSendOnPop = SM_None;
m_bZeroNextUpdate = false;
/* 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
* and set up m_SystemLayer. */
@@ -104,6 +106,8 @@ void ScreenManager::EmptyDeleteQueue()
if(!m_vScreensToDelete.size())
return;
m_bZeroNextUpdate = true;
for( unsigned i=0; i<m_vScreensToDelete.size(); i++ )
SAFE_DELETE( m_vScreensToDelete[i] );
@@ -146,16 +150,21 @@ void ScreenManager::Update( float fDeltaTime )
/* 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
* animations don't jump. */
if( pScreen && pScreen->IsFirstUpdate() )
if( pScreen && m_bZeroNextUpdate )
{
LOG->Trace( "Zeroing this update. Was %f", fDeltaTime );
fDeltaTime = 0;
m_bZeroNextUpdate = false;
}
if( pScreen )
pScreen->Update( fDeltaTime );
m_pSharedBGA->Update( fDeltaTime );
m_SystemLayer->Update( fDeltaTime );
m_SystemLayer->Update( fDeltaTime );
EmptyDeleteQueue();
if(m_sDelayedScreen.size() != 0)
@@ -218,6 +227,8 @@ void ScreenManager::Input( const DeviceInput& DeviceI, const InputEventType type
Screen* ScreenManager::MakeNewScreen( const CString &sScreenName )
{
m_bZeroNextUpdate = true;
/* 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).
* 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 )
{
m_bZeroNextUpdate = true;
// Delete previously prepared versions of the screen.
FOREACH( Screen*, m_vPreparedScreens, s )
{
@@ -266,6 +279,8 @@ void ScreenManager::PrepareScreen( const CString &sScreenName )
void ScreenManager::DeletePreparedScreens()
{
m_bZeroNextUpdate = true;
FOREACH( Screen*, m_vPreparedScreens, s )
SAFE_DELETE( *s );
m_vPreparedScreens.clear();
@@ -314,6 +329,8 @@ void ScreenManager::SetNewScreen( const CString &sScreenName )
void ScreenManager::LoadDelayedScreen()
{
m_bZeroNextUpdate = true;
retry:
CString sScreenName = m_sDelayedScreen;
m_sDelayedScreen = "";
@@ -407,7 +424,9 @@ retry:
}
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
* in the new screen's ctor. */
if( m_ScreenStack.size() )
+4
View File
@@ -71,6 +71,10 @@ private:
ScreenMessage m_MessageSendOnPop;
vector<Screen*> m_vPreparedScreens;
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 );
void SetFromNewScreen( Screen *pNewScreen, bool Stack );