diff --git a/stepmania/src/ScreenStage.cpp b/stepmania/src/ScreenStage.cpp index 1bde20780f..6f5bdcb030 100644 --- a/stepmania/src/ScreenStage.cpp +++ b/stepmania/src/ScreenStage.cpp @@ -33,6 +33,8 @@ const ScreenMessage SM_PrepScreen = (ScreenMessage)(SM_User+0); ScreenStage::ScreenStage( CString sClassName ) : Screen( sClassName ) { + m_bZeroDeltaOnNextUpdate = false; + SOUND->StopMusic(); LIGHTSMAN->SetLightsMode( LIGHTSMODE_STAGE ); @@ -146,6 +148,17 @@ void ScreenStage::HandleScreenMessage( const ScreenMessage SM ) } } +void ScreenStage::Update( float fDeltaTime ) +{ + if( m_bZeroDeltaOnNextUpdate ) + { + m_bZeroDeltaOnNextUpdate = false; + fDeltaTime = 0; + } + + Screen::Update( fDeltaTime ); +} + void ScreenStage::MenuBack( PlayerNumber pn ) { if( m_In.IsTransitioning() || m_Out.IsTransitioning() || m_Back.IsTransitioning() ) @@ -153,4 +166,11 @@ void ScreenStage::MenuBack( PlayerNumber pn ) this->ClearMessageQueue(); m_Back.StartTransitioning( SM_GoToPrevScreen ); + SOUND->PlayOnce( THEME->GetPathToS("Common back") ); + + /* If a Back is buffered while we're prepping the screen (very common), we'll + * get it right after the prep finishes. However, the next update will contain + * the time spent prepping the screen. Zero the next delta, so the update is + * seen. */ + m_bZeroDeltaOnNextUpdate = true; } diff --git a/stepmania/src/ScreenStage.h b/stepmania/src/ScreenStage.h index e2fd29a565..2c50aa9877 100644 --- a/stepmania/src/ScreenStage.h +++ b/stepmania/src/ScreenStage.h @@ -22,7 +22,7 @@ public: ScreenStage( CString sName ); virtual void HandleScreenMessage( const ScreenMessage SM ); - + virtual void Update( float fDeltaTime ); virtual void MenuBack( PlayerNumber pn ); private: @@ -35,8 +35,8 @@ private: // elements that cannot be created with BGAnimation Sprite m_sprCharacterIcon[NUM_PLAYERS]; -protected: + bool m_bZeroDeltaOnNextUpdate; };