add SSMaster::WrapScroller and ScrollerFastCatchup

This commit is contained in:
Chris Danford
2005-05-03 23:12:29 +00:00
parent b9e16ed9c6
commit ab543597cd
5 changed files with 46 additions and 6 deletions
+4
View File
@@ -2994,6 +2994,8 @@ NumIconParts=0
NumCursorParts=0
NumPreviewParts=0
ShowScroller=0
WrapScroller=0
ScrollerFastCatchup=0
# All on page 1 by default.
NumChoicesOnPage1=999
SharedPreviewAndCursor=1
@@ -3285,6 +3287,8 @@ NumIconParts=0
NumCursorParts=0
NumPreviewParts=0
ShowScroller=0
WrapScroller=0
ScrollerFastCatchup=0
# All on page 1 by default.
NumChoicesOnPage1=999
SharedPreviewAndCursor=1
+13 -3
View File
@@ -127,11 +127,13 @@ void ActorScroller::Load2(
void ActorScroller::Load3(
float fSecondsPerItem,
float fNumItemsToDraw,
bool bFastCatchup,
const CString &sExprTransform
)
{
m_fSecondsPerItem = fSecondsPerItem;
m_fNumItemsToDraw = fNumItemsToDraw;
m_bFastCatchup = bFastCatchup;
m_exprTransform.SetFromExpression( sExprTransform );
m_fQuantizePixels = 0;
m_bLoaded = true;
@@ -230,7 +232,17 @@ void ActorScroller::Update( float fDeltaTime )
float fOldItemAtTop = m_fCurrentItem;
if( m_fSecondsPerItem > 0 )
fapproach( m_fCurrentItem, m_fDestinationItem, fDeltaTime/m_fSecondsPerItem );
{
float fApproachSpeed = fDeltaTime/m_fSecondsPerItem;
if( m_bFastCatchup )
{
float fDistanceToMove = fabsf(m_fCurrentItem - m_fDestinationItem);
if( fDistanceToMove > 1 )
fApproachSpeed *= fDistanceToMove*fDistanceToMove;
}
fapproach( m_fCurrentItem, m_fDestinationItem, fApproachSpeed );
}
// if items changed, then pause
if( (int)fOldItemAtTop != (int)m_fCurrentItem )
@@ -294,8 +306,6 @@ void ActorScroller::DrawPrimitives()
bool bDelayedDraw = m_bDrawByZPosition && !m_bLoop;
vector<Actor*> subs;
if( bDelayedDraw )
subs = m_SubActors;
for( int iItem=(int)truncf(ceilf(fFirstItemToDraw)); iItem<=fLastItemToDraw; iItem++ )
{
+3
View File
@@ -47,6 +47,7 @@ public:
void Load3(
float fSecondsPerItem,
float fNumItemsToDraw,
bool bFastCatchup,
const CString &sExprTransform );
virtual void Update( float fDelta );
@@ -56,6 +57,7 @@ public:
void SetDestinationItem( float fItemIndex ) { m_fDestinationItem = fItemIndex; }
void SetCurrentAndDestinationItem( float fItemIndex ) { m_fCurrentItem = m_fDestinationItem = fItemIndex; }
float GetCurrentItem() { return m_fCurrentItem; }
float GetDestinationItem() { return m_fDestinationItem; }
void SetPauseCountdownSeconds( float fSecs ) { m_fPauseCountdownSeconds = fSecs; }
@@ -76,6 +78,7 @@ protected:
float m_fSecondsPauseBetweenItems;
float m_fNumItemsToDraw;
bool m_bLoop;
bool m_bFastCatchup;
float m_fPauseCountdownSeconds;
float m_fQuantizePixels;
+23 -2
View File
@@ -38,6 +38,8 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl
SLEEP_AFTER_TWEEN_OFF_SECONDS(m_sName,"SleepAfterTweenOffSeconds"),
OPTION_ORDER(m_sName,OPTION_ORDER_NAME,NUM_MENU_DIRS),
WRAP_CURSOR(m_sName,"WrapCursor"),
WRAP_SCROLLER(m_sName,"WrapScroller"),
SCROLLER_FAST_CATCHUP(m_sName,"ScrollerFastCatchup"),
ALLOW_REPEATING_INPUT(m_sName,"AllowRepeatingInput"),
SHOW_SCROLLER(m_sName,"ShowScroller"),
SCROLLER_SECONDS_PER_ITEM(m_sName,"ScrollerSecondsPerItem"),
@@ -101,6 +103,7 @@ void ScreenSelectMaster::Init()
m_Scroller[0].Load3(
SCROLLER_SECONDS_PER_ITEM,
SCROLLER_NUM_ITEMS_TO_DRAW,
SCROLLER_FAST_CATCHUP,
SCROLLER_TRANSFORM
);
m_Scroller[0].SetName( "Scroller" );
@@ -122,6 +125,7 @@ void ScreenSelectMaster::Init()
m_Scroller[p].Load3(
SCROLLER_SECONDS_PER_ITEM,
SCROLLER_NUM_ITEMS_TO_DRAW,
SCROLLER_FAST_CATCHUP,
SCROLLER_TRANSFORM
);
m_Scroller[p].SetName( ssprintf("ScrollerP%d",p+1) );
@@ -384,7 +388,7 @@ bool ScreenSelectMaster::Move( PlayerNumber pn, MenuDir dir )
}
while( !m_aGameCommands[iSwitchToIndex].IsPlayable() );
return ChangeSelection( pn, iSwitchToIndex );
return ChangeSelection( pn, dir, iSwitchToIndex );
}
void ScreenSelectMaster::MenuLeft( PlayerNumber pn, const InputEventType type )
@@ -518,7 +522,7 @@ bool ScreenSelectMaster::ChangePage( int iNewChoice )
return true;
}
bool ScreenSelectMaster::ChangeSelection( PlayerNumber pn, int iNewChoice )
bool ScreenSelectMaster::ChangeSelection( PlayerNumber pn, MenuDir dir, int iNewChoice )
{
if( iNewChoice == m_iChoice[pn] )
return false; // already there
@@ -583,6 +587,23 @@ bool ScreenSelectMaster::ChangeSelection( PlayerNumber pn, int iNewChoice )
if( SHOW_SCROLLER )
{
if( WRAP_SCROLLER )
{
// HACK: We can't tell from the option orders whether or not we wrapped.
// For now, assume that the order is increasing left to right.
int iPressedDir = (dir == MENU_DIR_LEFT) ? -1 : +1;
int iActualDir = (iOldChoice < iNewChoice) ? +1 : -1;
if( iPressedDir != iActualDir ) // wrapped
{
ActorScroller &scroller = SHARED_PREVIEW_AND_CURSOR ? m_Scroller[0] : m_Scroller[p];
float fItem = scroller.GetCurrentItem();
int iNumChoices = m_aGameCommands.size();
fItem += iActualDir * iNumChoices;
scroller.SetCurrentAndDestinationItem( fItem );
}
}
if( SHARED_PREVIEW_AND_CURSOR )
m_Scroller[0].SetDestinationItem( (float)iNewChoice );
else
+3 -1
View File
@@ -52,6 +52,8 @@ protected:
ThemeMetric<float> SLEEP_AFTER_TWEEN_OFF_SECONDS;
ThemeMetric1D<CString> OPTION_ORDER;
ThemeMetric<bool> WRAP_CURSOR;
ThemeMetric<bool> WRAP_SCROLLER;
ThemeMetric<bool> SCROLLER_FAST_CATCHUP;
ThemeMetric<bool> ALLOW_REPEATING_INPUT;
ThemeMetric<bool> SHOW_SCROLLER;
ThemeMetric<float> SCROLLER_SECONDS_PER_ITEM;
@@ -67,7 +69,7 @@ protected:
bool Move( PlayerNumber pn, MenuDir dir );
bool ChangePage( int iNewChoice );
bool ChangeSelection( PlayerNumber pn, int iNewChoice );
bool ChangeSelection( PlayerNumber pn, MenuDir dir, int iNewChoice );
float DoMenuStart( PlayerNumber pn );
float GetCursorX( PlayerNumber pn, int iPartIndex );