zero the next update after creating or deleting a screen so we don't skip
This commit is contained in:
@@ -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() )
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user