diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index e49daaab6c..414135cf75 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -14,6 +14,9 @@ #include "ScreenDimensions.h" #include "ThemeManager.h" #include "RageMusic.h" +#include "WindowManager.h" // for sending SM_PlayMusicSample + + const float SWITCH_MUSIC_TIME = 0.3f; @@ -188,9 +191,9 @@ MusicWheel::MusicWheel() m_iSelection = 0; - // fade the wheel in m_WheelState = STATE_IDLE; m_fTimeLeftInState = FADE_TIME; + m_fPositionOffsetFromSelection = 0; RageLog( "end of MusicWheel::MusicWheel()" ); @@ -381,24 +384,18 @@ void MusicWheel::RenderPrimitives() } // iIndex is now the index of the lowest WheelItem to draw - for( i=0; iSendMessageToTopWindow( SM_PlayMusicSample, 0 ); break; case STATE_FLYING_OFF_BEFORE_NEXT_SORT: { @@ -469,11 +465,11 @@ void MusicWheel::Update( float fDeltaTime ) } break; case STATE_FLYING_ON_AFTER_NEXT_SORT: - PlayMusicSample(); + WM->SendMessageToTopWindow( SM_PlayMusicSample, 0 ); m_WheelState = STATE_IDLE; // now, wait for input break; case STATE_TWEENING_ON_SCREEN: - PlayMusicSample(); + WM->SendMessageToTopWindow( SM_PlayMusicSample, 0 ); m_WheelState = STATE_IDLE; m_fTimeLeftInState = 0; break; @@ -487,6 +483,15 @@ void MusicWheel::Update( float fDeltaTime ) } } + // "rotate" wheel toward selected song + + if( fabs(m_fPositionOffsetFromSelection) < 0.05f ) + m_fPositionOffsetFromSelection = 0; + else + { + m_fPositionOffsetFromSelection -= fDeltaTime * m_fPositionOffsetFromSelection*4; // linear + //m_fPositionOffsetFromSelection += fDeltaTime * m_fPositionOffsetFromSelection/fabs(m_fPositionOffsetFromSelection); // constant + } } @@ -494,9 +499,8 @@ void MusicWheel::PrevMusic() { switch( m_WheelState ) { - //case STATE_SWITCHING_TO_PREV_MUSIC: - case STATE_IDLE: + case STATE_SWITCHING_MUSIC: break; // fall through default: return; // don't fall through @@ -508,7 +512,9 @@ void MusicWheel::PrevMusic() if( m_iSelection < 0 ) m_iSelection = m_WheelItems.GetSize()-1; - m_WheelState = STATE_SWITCHING_TO_PREV_MUSIC; + m_fPositionOffsetFromSelection -= 1; + + m_WheelState = STATE_SWITCHING_MUSIC; m_fTimeLeftInState = SWITCH_MUSIC_TIME; m_soundChangeMusic.PlayRandom(); } @@ -518,8 +524,7 @@ void MusicWheel::NextMusic() switch( m_WheelState ) { case STATE_IDLE: - case STATE_SWITCHING_TO_NEXT_MUSIC: - case STATE_SWITCHING_TO_PREV_MUSIC: + case STATE_SWITCHING_MUSIC: break; // fall through default: return; // don't continue @@ -531,7 +536,9 @@ void MusicWheel::NextMusic() if( m_iSelection > m_WheelItems.GetSize()-1 ) m_iSelection = 0; - m_WheelState = STATE_SWITCHING_TO_NEXT_MUSIC; + m_fPositionOffsetFromSelection += 1; + + m_WheelState = STATE_SWITCHING_MUSIC; m_fTimeLeftInState = SWITCH_MUSIC_TIME; m_soundChangeMusic.PlayRandom(); } @@ -541,8 +548,7 @@ void MusicWheel::NextSort() switch( m_WheelState ) { case STATE_IDLE: - case STATE_SWITCHING_TO_NEXT_MUSIC: - case STATE_SWITCHING_TO_PREV_MUSIC: + case STATE_SWITCHING_MUSIC: break; // fall through default: return; // don't continue @@ -598,21 +604,3 @@ bool MusicWheel::Select() } } -void MusicWheel::PlayMusicSample() -{ - //RageLog( "WindowSelectSong::PlaySongSample()" ); - - MUSIC->Stop(); - - Song* pSong = GetSelectedSong(); - if( pSong == NULL ) - return; - - CString sSongToPlay = pSong->GetMusicPath(); - - if( pSong->HasMusic() ) - { - MUSIC->Load( sSongToPlay ); - MUSIC->Play(); - } -} diff --git a/stepmania/src/MusicWheel.h b/stepmania/src/MusicWheel.h index 65b47d3324..080a844954 100644 --- a/stepmania/src/MusicWheel.h +++ b/stepmania/src/MusicWheel.h @@ -24,13 +24,16 @@ #include "RageSoundStream.h" #include "MusicSortDisplay.h" #include "MusicStatusDisplay.h" - +#include "Window.h" // for WindowMessage const int NUM_WHEEL_ITEMS_TO_DRAW = 13; const float FADE_TIME = 0.5f; +const WindowMessage SM_PlayMusicSample = WindowMessage(SM_User+47); // this should be unique! + + class WheelItem : public ActorFrame { @@ -100,8 +103,6 @@ public: protected: void RebuildWheelItems(); - void PlayMusicSample(); - Sprite m_sprSelectionBackground; Sprite m_sprSelectionOverlay; @@ -119,8 +120,7 @@ protected: enum WheelState { STATE_IDLE, - STATE_SWITCHING_TO_PREV_MUSIC, - STATE_SWITCHING_TO_NEXT_MUSIC, + STATE_SWITCHING_MUSIC, STATE_FLYING_OFF_BEFORE_NEXT_SORT, STATE_FLYING_ON_AFTER_NEXT_SORT, STATE_TWEENING_ON_SCREEN, @@ -129,6 +129,7 @@ protected: }; WheelState m_WheelState; float m_fTimeLeftInState; + float m_fPositionOffsetFromSelection; // having sounds here causes a crash in Bass. What the heck!?!?!