From 8f80256fc4b549d0d01fe1fedda247f49966d057 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sat, 21 Dec 2002 10:04:25 +0000 Subject: [PATCH] add quick settling --- stepmania/src/GradeDisplay.cpp | 60 ++++++++++++++++++++++-------- stepmania/src/GradeDisplay.h | 6 ++- stepmania/src/ScreenEvaluation.cpp | 10 +++++ stepmania/src/ScreenEvaluation.h | 2 + 4 files changed, 61 insertions(+), 17 deletions(-) diff --git a/stepmania/src/GradeDisplay.cpp b/stepmania/src/GradeDisplay.cpp index 117167b7bf..c9648aef3b 100644 --- a/stepmania/src/GradeDisplay.cpp +++ b/stepmania/src/GradeDisplay.cpp @@ -18,6 +18,7 @@ const float SCROLL_TIME = 5.0f; +const float QUICK_SCROLL_TIME = .25f; const int NUM_GRADE_FRAMES = 7; const float GRADE_FRAME_HEIGHT = 1/(float)NUM_GRADE_FRAMES; const float GRADES_TO_SCROLL = NUM_GRADE_FRAMES*4; @@ -29,7 +30,7 @@ GradeDisplay::GradeDisplay() StopAnimating(); m_fTimeLeftInScroll = 0; - m_bDoScrolling = false; + m_bDoScrolling = 0; SetGrade( PLAYER_1, GRADE_NO_DATA ); } @@ -43,21 +44,26 @@ void GradeDisplay::Update( float fDeltaTime ) m_fTimeLeftInScroll -= fDeltaTime; m_fTimeLeftInScroll = max( 0, m_fTimeLeftInScroll ); - float fPercentIntoScrolling = 1 - (m_fTimeLeftInScroll/SCROLL_TIME); - if( fPercentIntoScrolling < 0.75 ) - fPercentIntoScrolling = (fPercentIntoScrolling/0.75f) * (1 + 1.0f/NUM_GRADE_FRAMES); - else if( fPercentIntoScrolling < 0.9 ) - fPercentIntoScrolling = 1 + 1.0f/NUM_GRADE_FRAMES; - else - fPercentIntoScrolling = (1 + 1.0f/NUM_GRADE_FRAMES) - ((fPercentIntoScrolling-0.9f)/0.1f) * 1.0f/NUM_GRADE_FRAMES; + float fPercentIntoScrolling; + if( m_bDoScrolling == 1) + { + fPercentIntoScrolling = 1 - (m_fTimeLeftInScroll/SCROLL_TIME); + if( fPercentIntoScrolling < 0.75 ) + fPercentIntoScrolling = (fPercentIntoScrolling/0.75f) * (1 + 1.0f/NUM_GRADE_FRAMES); + else if( fPercentIntoScrolling < 0.9 ) + fPercentIntoScrolling = 1 + 1.0f/NUM_GRADE_FRAMES; + else + fPercentIntoScrolling = (1 + 1.0f/NUM_GRADE_FRAMES) - ((fPercentIntoScrolling-0.9f)/0.1f) * 1.0f/NUM_GRADE_FRAMES; + } else { + fPercentIntoScrolling = 1 - (m_fTimeLeftInScroll/QUICK_SCROLL_TIME); + } + + m_frectCurTexCoords.left = m_frectStartTexCoords.left*(1-fPercentIntoScrolling) + m_frectDestTexCoords.left*fPercentIntoScrolling; + m_frectCurTexCoords.top = m_frectStartTexCoords.top*(1-fPercentIntoScrolling) + m_frectDestTexCoords.top*fPercentIntoScrolling; + m_frectCurTexCoords.right = m_frectStartTexCoords.right*(1-fPercentIntoScrolling) + m_frectDestTexCoords.right*fPercentIntoScrolling; + m_frectCurTexCoords.bottom = m_frectStartTexCoords.bottom*(1-fPercentIntoScrolling) + m_frectDestTexCoords.bottom*fPercentIntoScrolling; - RectF frectCurrentTextureCoords; - frectCurrentTextureCoords.left = m_frectStartTexCoords.left*(1-fPercentIntoScrolling) + m_frectDestTexCoords.left*fPercentIntoScrolling; - frectCurrentTextureCoords.top = m_frectStartTexCoords.top*(1-fPercentIntoScrolling) + m_frectDestTexCoords.top*fPercentIntoScrolling; - frectCurrentTextureCoords.right = m_frectStartTexCoords.right*(1-fPercentIntoScrolling) + m_frectDestTexCoords.right*fPercentIntoScrolling; - frectCurrentTextureCoords.bottom = m_frectStartTexCoords.bottom*(1-fPercentIntoScrolling) + m_frectDestTexCoords.bottom*fPercentIntoScrolling; - - this->SetCustomTextureRect( frectCurrentTextureCoords ); + this->SetCustomTextureRect( m_frectCurTexCoords ); } } @@ -120,9 +126,33 @@ void GradeDisplay::SpinAndSettleOn( Grade g ) m_frectStartTexCoords.bottom += GRADES_TO_SCROLL * GRADE_FRAME_HEIGHT; m_fTimeLeftInScroll = SCROLL_TIME; + + /* Set the initial position. */ + Update(0); } void GradeDisplay::SettleImmediately() { m_fTimeLeftInScroll = 0; } + +void GradeDisplay::SettleQuickly() +{ + if(m_bDoScrolling != 1) + return; + + /* m_frectDestTexCoords.top is between 0 and 1 (inclusive). m_frectCurTexCoords + * is somewhere above that. Shift m_frectCurTexCoords downwards so it's pointing + * at the same physical place (remember, the grade texture is tiled) but no more + * than one rotation away from the destination. */ + while(m_frectCurTexCoords.top > m_frectDestTexCoords.top + 1.0f) + { + m_frectCurTexCoords.top -= 1.0f; + m_frectCurTexCoords.bottom -= 1.0f; + } + + m_frectStartTexCoords = m_frectCurTexCoords; + m_bDoScrolling = 2; + m_fTimeLeftInScroll = QUICK_SCROLL_TIME; +} + diff --git a/stepmania/src/GradeDisplay.h b/stepmania/src/GradeDisplay.h index 6db1907449..0995aa3f7b 100644 --- a/stepmania/src/GradeDisplay.h +++ b/stepmania/src/GradeDisplay.h @@ -28,15 +28,17 @@ public: void SetGrade( PlayerNumber pn, Grade g ); void SpinAndSettleOn( Grade g ); void SettleImmediately(); + void SettleQuickly(); protected: Grade m_Grade; - // for scrolling - bool m_bDoScrolling; + // for scrolling; 0 = no, 1 = normal, 2 = quick + int m_bDoScrolling; RectF m_frectStartTexCoords; RectF m_frectDestTexCoords; + RectF m_frectCurTexCoords; float m_fTimeLeftInScroll; }; diff --git a/stepmania/src/ScreenEvaluation.cpp b/stepmania/src/ScreenEvaluation.cpp index 084e0d6f7c..e4f067c5c0 100644 --- a/stepmania/src/ScreenEvaluation.cpp +++ b/stepmania/src/ScreenEvaluation.cpp @@ -837,6 +837,16 @@ void ScreenEvaluation::HandleScreenMessage( const ScreenMessage SM ) } } +void ScreenEvaluation::MenuLeft( PlayerNumber pn ) +{ + m_Grades[pn].SettleQuickly(); +} + +void ScreenEvaluation::MenuRight( PlayerNumber pn ) +{ + m_Grades[pn].SettleQuickly(); +} + void ScreenEvaluation::MenuBack( PlayerNumber pn ) { MenuStart( pn ); diff --git a/stepmania/src/ScreenEvaluation.h b/stepmania/src/ScreenEvaluation.h index 7fa99b6aeb..4a1f1b52c9 100644 --- a/stepmania/src/ScreenEvaluation.h +++ b/stepmania/src/ScreenEvaluation.h @@ -38,6 +38,8 @@ public: virtual void TweenOnScreen(); virtual void TweenOffScreen(); + virtual void MenuLeft( PlayerNumber pn ); + virtual void MenuRight( PlayerNumber pn ); virtual void MenuBack( PlayerNumber pn ); virtual void MenuStart( PlayerNumber pn );