Add "scroller" to ScreenSelectOptionsMaster

This commit is contained in:
Chris Danford
2004-01-17 23:14:56 +00:00
parent 93204d9b08
commit a8510db992
10 changed files with 208 additions and 149 deletions
+8
View File
@@ -128,3 +128,11 @@ void ActorFrame::SortByZ()
// Preserve ordering of Actors with equal Z values.
stable_sort( m_SubActors.begin(), m_SubActors.end(), CompareActorsByZDesc );
}
void ActorFrame::DeleteAllChildren()
{
for( unsigned i=0; i<m_SubActors.size(); i++ )
delete m_SubActors[i];
m_SubActors.clear();
}
+2
View File
@@ -22,6 +22,8 @@ public:
virtual void SortByZ();
virtual ~ActorFrame() { }
void DeleteAllChildren();
virtual void RunCommandOnChildren( const CString &cmd ); /* but not on self */
+15 -54
View File
@@ -18,72 +18,33 @@
ActorScroller::ActorScroller()
{
m_fSecsIntoScroll = 0;
m_fCurrentItem = 0;
m_fDestinationItem = 0;
}
void ActorScroller::Load( vector<Actor*> vActors, float fBaseX, float fBaseY, float fVelX, float fVelY, float fSpacingX, float fSpacingY )
void ActorScroller::Load( float fScrollSecondsPerItem, float fSpacingX, float fSpacingY )
{
m_vActors = vActors;
m_vBase.x = fBaseX;
m_vBase.y = fBaseY;
m_vVelocity.x = fVelX;
m_vVelocity.y = fVelY;
ASSERT( fScrollSecondsPerItem > 0 );
m_fScrollSecondsPerItem = fScrollSecondsPerItem;
m_vSpacing.x = fSpacingX;
m_vSpacing.y = fSpacingY;
// adjust base
float t = 10000; // inf
if( m_vSpacing.x != 0 )
t = min( t, m_vBase.x / fabsf(m_vSpacing.x) );
if( m_vSpacing.y != 0 )
t = min( t, m_vBase.y / fabsf(m_vSpacing.y) );
m_vBase.x -= t * fabsf(m_vSpacing.x);
m_vBase.y -= t * fabsf(m_vSpacing.y);
if( m_vVelocity.x < 0 )
m_vBase.x += SCREEN_WIDTH;
if( m_vVelocity.y < 0 )
m_vBase.y += SCREEN_HEIGHT;
// push off screen
if( m_vVelocity.x!=0 ) m_vBase.x += m_vSpacing.x/2;
if( m_vVelocity.y!=0 ) m_vBase.y += m_vSpacing.y/2;
}
float ActorScroller::GetTotalSecsToScroll()
{
float fMaxSecToScroll = 0;
if( m_vVelocity.x != 0 )
{
float fSecToScroll = fabsf(m_vSpacing.x*(m_vActors.size()+1) + SCREEN_WIDTH) / fabsf(m_vVelocity.x);
fMaxSecToScroll = max( fMaxSecToScroll, fSecToScroll );
}
if( m_vVelocity.y != 0 )
{
float fSecToScroll = fabsf(m_vSpacing.y*(m_vActors.size()+1) + SCREEN_HEIGHT) / fabsf(m_vVelocity.y);
fMaxSecToScroll = max( fMaxSecToScroll, fSecToScroll );
}
return fMaxSecToScroll;
}
void ActorScroller::Update( float fDeltaTime )
{
m_fSecsIntoScroll += fDeltaTime;
ActorFrame::Update( fDeltaTime );
for( unsigned i=0; i<m_vActors.size(); i++ )
fapproach( m_fCurrentItem, m_fDestinationItem, fDeltaTime/m_fScrollSecondsPerItem );
for( unsigned i=0; i<m_SubActors.size(); i++ )
{
float fX = m_vBase.x + m_vSpacing.x * i + m_vVelocity.x * m_fSecsIntoScroll;
float fY = m_vBase.y + m_vSpacing.y * i + m_vVelocity.y * m_fSecsIntoScroll;
Actor* pActor = m_SubActors[i];
float fItemOffset = i - m_fCurrentItem;
float fX = m_vSpacing.x * fItemOffset;
float fY = m_vSpacing.y * fItemOffset;
fX = roundf( fX );
fY = roundf( fY );
m_vActors[i]->SetXY( fX, fY );
m_vActors[i]->Update( fDeltaTime );
pActor->SetXY( fX, fY );
}
}
void ActorScroller::DrawPrimitives()
{
for( unsigned i=0; i<m_vActors.size(); i++ )
if( !IsOffScreen(m_vActors[i]) )
m_vActors[i]->Draw();
}
+10 -12
View File
@@ -4,35 +4,33 @@
-----------------------------------------------------------------------------
Class: ActorScroller
Desc: A container for other actors.
Desc: An ActorFrame that moves its children.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "Actor.h"
#include "ActorFrame.h"
class ActorScroller : public Actor
class ActorScroller : public ActorFrame
{
public:
ActorScroller();
// owner's responsibility to delete vActors!
void Load( vector<Actor*> vActors, float fBaseX, float fBaseY, float fVelX, float fVelY, float fSpacingX, float fSpacingY );
void Load( float fScrollSecondsPerItem, float fSpacingX, float fSpacingY );
void Update( float fDelta );
void DrawPrimitives();
virtual void Update( float fDelta );
float GetTotalSecsToScroll();
void SetDestinationItem( int iItem ) { m_fDestinationItem = iItem; }
void SetCurrentAndDestinationItem( int iItem ) { m_fCurrentItem = m_fDestinationItem = iItem; }
protected:
float m_fSecsIntoScroll;
RageVector2 m_vBase;
RageVector2 m_vVelocity;
float m_fCurrentItem; // usually between 0 and m_SubActors.size()
float m_fDestinationItem;
float m_fScrollSecondsPerItem;
RageVector2 m_vSpacing;
vector<Actor*> m_vActors;
};
+3 -1
View File
@@ -94,11 +94,13 @@ void MenuTimer::Update( float fDeltaTime )
m_textDigit1.Command( WARNING_COMMAND(iNewDisplay) );
m_textDigit2.Command( WARNING_COMMAND(iNewDisplay) );
}
if( iNewDisplay == 0 )
{
Stop();
SCREENMAN->PostMessageToTopScreen( SM_MenuTimer, 0 );
m_textDigit1.SetEffectNone();
m_textDigit2.SetEffectNone();
}
if( iNewDisplay <= WARNING_BEEP_START )
+4 -4
View File
@@ -31,10 +31,10 @@ public:
protected:
BGAnimation m_Background;
Transition m_In;
Transition m_Out;
RandomSample m_soundStart;
BGAnimation m_Background;
Transition m_In;
Transition m_Out;
RandomSample m_soundStart;
};
+58 -69
View File
@@ -23,24 +23,18 @@
#include "BitmapText.h"
#define BACKGROUNDS_BASE_X THEME->GetMetricF("ScreenCredits","BackgroundsBaseX")
#define BACKGROUNDS_BASE_Y THEME->GetMetricF("ScreenCredits","BackgroundsBaseY")
#define BACKGROUNDS_VELOCITY_X THEME->GetMetricF("ScreenCredits","BackgroundsVelocityX")
#define BACKGROUNDS_VELOCITY_Y THEME->GetMetricF("ScreenCredits","BackgroundsVelocityY")
#define BACKGROUNDS_SPACING_X THEME->GetMetricF("ScreenCredits","BackgroundsSpacingX")
#define BACKGROUNDS_SPACING_Y THEME->GetMetricF("ScreenCredits","BackgroundsSpacingY")
#define BACKGROUNDS_WIDTH THEME->GetMetricF("ScreenCredits","BackgroundsWidth")
#define BACKGROUNDS_HEIGHT THEME->GetMetricF("ScreenCredits","BackgroundsHeight")
#define TEXTS_COLOR_INTRO THEME->GetMetricC("ScreenCredits","TextsColorIntro")
#define TEXTS_COLOR_HEADER THEME->GetMetricC("ScreenCredits","TextsColorHeader")
#define TEXTS_COLOR_NORMAL THEME->GetMetricC("ScreenCredits","TextsColorNormal")
#define TEXTS_ZOOM THEME->GetMetricF("ScreenCredits","TextsZoom")
#define TEXTS_BASE_X THEME->GetMetricF("ScreenCredits","TextsBaseX")
#define TEXTS_BASE_Y THEME->GetMetricF("ScreenCredits","TextsBaseY")
#define TEXTS_VELOCITY_X THEME->GetMetricF("ScreenCredits","TextsVelocityX")
#define TEXTS_VELOCITY_Y THEME->GetMetricF("ScreenCredits","TextsVelocityY")
#define TEXTS_SPACING_X THEME->GetMetricF("ScreenCredits","TextsSpacingX")
#define TEXTS_SPACING_Y THEME->GetMetricF("ScreenCredits","TextsSpacingY")
#define BACKGROUNDS_SPACING_X THEME->GetMetricF("ScreenCredits","BackgroundsSpacingX")
#define BACKGROUNDS_SPACING_Y THEME->GetMetricF("ScreenCredits","BackgroundsSpacingY")
#define BACKGROUNDS_SCROLL_SECONDS_PER_ITEM THEME->GetMetricF("ScreenCredits","BackgroundsScrollSecondsPerItem")
#define BACKGROUNDS_WIDTH THEME->GetMetricF("ScreenCredits","BackgroundsWidth")
#define BACKGROUNDS_HEIGHT THEME->GetMetricF("ScreenCredits","BackgroundsHeight")
#define TEXTS_COLOR_INTRO THEME->GetMetricC("ScreenCredits","TextsColorIntro")
#define TEXTS_COLOR_HEADER THEME->GetMetricC("ScreenCredits","TextsColorHeader")
#define TEXTS_COLOR_NORMAL THEME->GetMetricC("ScreenCredits","TextsColorNormal")
#define TEXTS_ZOOM THEME->GetMetricF("ScreenCredits","TextsZoom")
#define TEXTS_SPACING_X THEME->GetMetricF("ScreenCredits","TextsSpacingX")
#define TEXTS_SPACING_Y THEME->GetMetricF("ScreenCredits","TextsSpacingY")
#define TEXTS_SCROLL_SECONDS_PER_ITEM THEME->GetMetricF("ScreenCredits","TextsScrollSecondsPerItem")
const int NUM_BACKGROUNDS = 20;
@@ -60,7 +54,9 @@ static const CreditLine CREDIT_LINES[] =
{0,"Lucas “v1ral” Tang"},
// "Who?" = "what is this person's real name", not "what did they do".
// Who knows? Some people might not want to reveal their real name. - Friez.
// FYI: Several people have requested that their real names not be shown. -Chris
// Several people have requested that their real names not be shown. -Chris
// This isn't a good place to keep a master list of contributors because
// it's not a very complete list. -Chris
{0,"SPiGuMuS"}, // who?
{0,"Visage"}, // who? makes para para theme graphics for me, wants to do BM and IIDX graphics too. - Friez
{0,"Ryan “DJ McFox” McKanna"},
@@ -171,7 +167,6 @@ static const CreditLine CREDIT_LINES[] =
{1,"Join the StepMania team"},
{1,"and help us out!"},
};
const unsigned NUM_CREDIT_LINES = sizeof(CREDIT_LINES) / sizeof(CreditLine);
ScreenCredits::ScreenCredits( CString sName ) : ScreenAttract( sName )
@@ -180,50 +175,54 @@ ScreenCredits::ScreenCredits( CString sName ) : ScreenAttract( sName )
SONGMAN->GetSongs( arraySongs );
SortSongPointerArrayByTitle( arraySongs );
int i;
for( i=0; i<NUM_BACKGROUNDS; i++ )
{
Song* pSong = NULL;
for( int j=0; j<50; j++ )
{
pSong = arraySongs[ rand()%arraySongs.size() ];
if( pSong->HasBackground() )
break;
}
Sprite* pBackground = new Sprite;
pBackground->LoadBG( pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathToG("Common fallback background") );
pBackground->ScaleToClipped( BACKGROUNDS_WIDTH, BACKGROUNDS_HEIGHT );
m_vBackgrounds.push_back( pBackground );
Sprite* pFrame = new Sprite;
pFrame->Load( THEME->GetPathToG("ScreenCredits background frame") );
m_vFrames.push_back( pFrame );
}
m_ScrollerBackgrounds.Load( m_vBackgrounds, BACKGROUNDS_BASE_X, BACKGROUNDS_BASE_Y, BACKGROUNDS_VELOCITY_X, BACKGROUNDS_VELOCITY_Y, BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y );
m_ScrollerBackgrounds.Load( BACKGROUNDS_SCROLL_SECONDS_PER_ITEM, BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y );
this->AddChild( &m_ScrollerBackgrounds );
m_ScrollerFrames.Load( m_vFrames, BACKGROUNDS_BASE_X, BACKGROUNDS_BASE_Y, BACKGROUNDS_VELOCITY_X, BACKGROUNDS_VELOCITY_Y, BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y );
m_ScrollerFrames.Load( BACKGROUNDS_SCROLL_SECONDS_PER_ITEM, BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y );
this->AddChild( &m_ScrollerFrames );
for( i=0; i<int(NUM_CREDIT_LINES); i++ )
{
BitmapText* pText = new BitmapText;
pText->LoadFromFont( THEME->GetPathToF("ScreenCredits titles") );
pText->SetText( CREDIT_LINES[i].text );
switch( CREDIT_LINES[i].colorIndex )
for( int i=0; i<NUM_BACKGROUNDS; i++ )
{
case 1: pText->SetDiffuse( TEXTS_COLOR_INTRO ); break;
case 2: pText->SetDiffuse( TEXTS_COLOR_HEADER ); break;
case 0: pText->SetDiffuse( TEXTS_COLOR_NORMAL ); break;
default: ASSERT(0);
Song* pSong = NULL;
for( int j=0; j<50; j++ )
{
pSong = arraySongs[ rand()%arraySongs.size() ];
if( pSong->HasBackground() )
break;
}
Sprite* pBackground = new Sprite;
pBackground->LoadBG( pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathToG("Common fallback background") );
pBackground->ScaleToClipped( BACKGROUNDS_WIDTH, BACKGROUNDS_HEIGHT );
m_ScrollerBackgrounds.AddChild( pBackground );
Sprite* pFrame = new Sprite;
pFrame->Load( THEME->GetPathToG("ScreenCredits background frame") );
m_ScrollerFrames.AddChild( pFrame );
}
pText->SetZoom( TEXTS_ZOOM );
m_vTexts.push_back( pText );
}
m_ScrollerTexts.Load( m_vTexts, TEXTS_BASE_X, TEXTS_BASE_Y, TEXTS_VELOCITY_X, TEXTS_VELOCITY_Y, TEXTS_SPACING_X, TEXTS_SPACING_Y );
m_ScrollerTexts.Load( TEXTS_SCROLL_SECONDS_PER_ITEM, TEXTS_SPACING_X, TEXTS_SPACING_Y );
this->AddChild( &m_ScrollerTexts );
{
for( int i=0; i<ARRAYSIZE(CREDIT_LINES); i++ )
{
BitmapText* pText = new BitmapText;
pText->LoadFromFont( THEME->GetPathToF("ScreenCredits titles") );
pText->SetText( CREDIT_LINES[i].text );
switch( CREDIT_LINES[i].colorIndex )
{
case 1: pText->SetDiffuse( TEXTS_COLOR_INTRO ); break;
case 2: pText->SetDiffuse( TEXTS_COLOR_HEADER ); break;
case 0: pText->SetDiffuse( TEXTS_COLOR_NORMAL ); break;
default: ASSERT(0);
}
pText->SetZoom( TEXTS_ZOOM );
m_ScrollerTexts.AddChild( pText );
}
}
m_Overlay.LoadFromAniDir( THEME->GetPathToB("ScreenCredits overlay") );
this->AddChild( &m_Overlay );
@@ -231,26 +230,16 @@ ScreenCredits::ScreenCredits( CString sName ) : ScreenAttract( sName )
this->MoveToTail( &m_Out ); // put it in the back so it covers up the stuff we just added
this->ClearMessageQueue( SM_BeginFadingOut ); // ignore ScreenAttract's SecsToShow
this->PostScreenMessage( SM_BeginFadingOut, m_ScrollerTexts.GetTotalSecsToScroll() );
this->PostScreenMessage( SM_BeginFadingOut, m_Background.GetLengthSeconds() );
SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo("credits") );
}
ScreenCredits::~ScreenCredits()
{
unsigned i;
for( i=0; i<m_vBackgrounds.size(); i++ )
delete m_vBackgrounds[i];
m_vBackgrounds.clear();
for( i=0; i<m_vFrames.size(); i++ )
delete m_vFrames[i];
m_vFrames.clear();
for( i=0; i<m_vTexts.size(); i++ )
delete m_vTexts[i];
m_vTexts.clear();
m_ScrollerBackgrounds.DeleteAllChildren();
m_ScrollerFrames.DeleteAllChildren();
m_ScrollerTexts.DeleteAllChildren();
}
-5
View File
@@ -25,13 +25,8 @@ public:
private:
ActorScroller m_ScrollerBackgrounds;
vector<Actor*> m_vBackgrounds;
ActorScroller m_ScrollerFrames;
vector<Actor*> m_vFrames;
ActorScroller m_ScrollerTexts;
vector<Actor*> m_vTexts;
BGAnimation m_Overlay;
};
+101 -4
View File
@@ -33,6 +33,10 @@
#define POST_SWITCH_PAGE_SECONDS THEME->GetMetricF(m_sName,"PostSwitchPageSeconds")
#define EXTRA_SLEEP_AFTER_TWEEN_OFF_SECONDS THEME->GetMetricF(m_sName,"ExtraSleepAfterTweenOffSeconds")
#define OPTION_ORDER( dir ) THEME->GetMetric (m_sName,"OptionOrder"+CString(dir))
#define SHOW_SCROLLER THEME->GetMetricB(m_sName,"ShowScroller")
#define SCROLLER_SECONDS_PER_ITEM THEME->GetMetricF(m_sName,"ScrollerSecondsPerItem")
#define SCROLLER_SPACING_X THEME->GetMetricF(m_sName,"ScrollerSpacingX")
#define SCROLLER_SPACING_Y THEME->GetMetricF(m_sName,"ScrollerSpacingY")
/* OptionOrderLeft=0:1,1:2,2:3,3:4 */
const char *ScreenSelectMaster::dirs[NUM_DIRS] =
@@ -52,6 +56,7 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl
m_bChosen[p] = false;
}
// init cursor
if( SHARED_PREVIEW_AND_CURSOR )
{
for( i=0; i<NUM_CURSOR_PARTS; i++ )
@@ -78,10 +83,54 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl
}
}
// init scroll
if( SHOW_SCROLLER )
{
if( SHARED_PREVIEW_AND_CURSOR )
{
m_Scroller[0].Load( SCROLLER_SECONDS_PER_ITEM, SCROLLER_SPACING_X, SCROLLER_SPACING_Y );
m_Scroller[0].SetName( "Scroller" );
this->AddChild( &m_Scroller[0] );
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
{
// const ModeChoice& mc = m_aModeChoices[c];
CString sFName = ssprintf("%s Scroll Choice%d", m_sName.c_str(),c+1);
m_sprScroll[c][0].Load( THEME->GetPathToG(sFName) );
m_sprScroll[c][0]->SetName( ssprintf("Scroll") );
m_Scroller[0].AddChild( m_sprScroll[c][0] );
}
}
else
{
for( p=0; p<NUM_PLAYERS; p++ )
{
if( !GAMESTATE->IsPlayerEnabled(p) )
continue; // skip
m_Scroller[p].Load( SCROLLER_SECONDS_PER_ITEM, SCROLLER_SPACING_X, SCROLLER_SPACING_Y );
m_Scroller[p].SetName( ssprintf("ScrollerP%d",p+1) );
this->AddChild( &m_Scroller[p] );
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
{
// const ModeChoice& mc = m_aModeChoices[c];
CString sFName = ssprintf("%s Scroll Choice%d P%d", m_sName.c_str(),c+1,p+1);
m_sprScroll[c][p].Load( THEME->GetPathToG(sFName) );
m_sprScroll[c][p]->SetName( ssprintf("ScrollP%d",p+1) );
m_Scroller[p].AddChild( m_sprScroll[c][p] );
}
}
}
}
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
{
// const ModeChoice& mc = m_aModeChoices[c];
// init icon
for( i=0; i<NUM_ICON_PARTS; i++ )
{
CString sFName = ssprintf("%s Icon Part%d Choice%d", m_sName.c_str(),i+1,c+1);
@@ -90,6 +139,7 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl
this->AddChild( m_sprIcon[i][c] );
}
// init preview
if( SHARED_PREVIEW_AND_CURSOR )
{
for( i=0; i<NUM_PREVIEW_PARTS; i++ )
@@ -102,12 +152,12 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl
}
else
{
for( i=0; i<NUM_PREVIEW_PARTS; i++ )
for( p=0; p<NUM_PLAYERS; p++ )
{
for( p=0; p<NUM_PLAYERS; p++ )
if( !GAMESTATE->IsPlayerEnabled(p) )
continue; // skip
for( i=0; i<NUM_PREVIEW_PARTS; i++ )
{
if( !GAMESTATE->IsPlayerEnabled(p) )
continue; // skip
CString sFName = ssprintf("%s Preview Part%d Choice%d P%d", m_sName.c_str(),i+1,c+1,p+1);
m_sprPreview[i][c][p].Load( THEME->GetPathToG(sFName) );
m_sprPreview[i][c][p]->SetName( ssprintf("PreviewPart%dP%d",i+1,p+1) );
@@ -117,6 +167,7 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl
}
}
for( int page=0; page<NUM_PAGES; page++ )
{
m_sprMore[page].SetName( ssprintf("MorePage%d",page+1) );
@@ -139,6 +190,7 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl
m_soundSelect.Load( THEME->GetPathToS( "Common start") );
m_soundDifficult.Load( ANNOUNCER->GetPathTo("select difficulty challenge") );
// init m_Next order info
for( int dir = 0; dir < NUM_DIRS; ++dir )
{
const CString dirname = dirs[dir];
@@ -370,6 +422,7 @@ bool ScreenSelectMaster::ChangePage( int iNewChoice )
// XXX: only play this once (I thought we already did that?)
// DDR plays it on every change to page 2. -Chris
/* That sounds ugly if you go back and forth quickly. -g */
// DDR locks input while it's scrolling. Should we do the same? -Chris
m_soundDifficult.Stop();
m_soundDifficult.PlayRandom();
}
@@ -444,8 +497,24 @@ bool ScreenSelectMaster::ChangeSelection( PlayerNumber pn, int iNewChoice )
m_sprCursor[i][p].SetXY( GetCursorX((PlayerNumber)p,i), GetCursorY((PlayerNumber)p,i) );
}
}
if( SHOW_SCROLLER )
{
if( SHARED_PREVIEW_AND_CURSOR )
m_Scroller[0].SetDestinationItem( iNewChoice );
else
m_Scroller[p].SetDestinationItem( iNewChoice );
if( SHARED_PREVIEW_AND_CURSOR )
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
COMMAND( *m_sprScroll[c][0], int(c) == m_iChoice[0]? "GainFocus":"LoseFocus" );
else
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
COMMAND( *m_sprScroll[c][p], int(c) == m_iChoice[p]? "GainFocus":"LoseFocus" );
}
}
return true;
}
@@ -577,6 +646,25 @@ float ScreenSelectMaster::TweenOnScreen()
}
}
if( SHOW_SCROLLER )
{
if( SHARED_PREVIEW_AND_CURSOR )
{
m_Scroller[0].SetCurrentAndDestinationItem( m_iChoice[0] );
fSecs = max( fSecs, SET_XY_AND_ON_COMMAND( m_Scroller[0] ) );
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
fSecs = max( fSecs, COMMAND( *m_sprScroll[c][0], int(c) == m_iChoice[0]? "GainFocus":"LoseFocus" ) );
}
else
for( int p=0; p<NUM_PLAYERS; p++ )
if( GAMESTATE->IsPlayerEnabled(p) )
{
m_Scroller[p].SetCurrentAndDestinationItem( m_iChoice[p] );
fSecs = max( fSecs, SET_XY_AND_ON_COMMAND( m_Scroller[p] ) );
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
fSecs = max( fSecs, COMMAND( *m_sprScroll[c][p], int(c) == m_iChoice[p]? "GainFocus":"LoseFocus" ) );
}
}
fSecs = max( fSecs, SET_XY_AND_ON_COMMAND( m_sprExplanation[GetCurrentPage()] ) );
fSecs = max( fSecs, SET_XY_AND_ON_COMMAND( m_sprMore[GetCurrentPage()] ) );
@@ -646,6 +734,15 @@ float ScreenSelectMaster::TweenOffScreen()
}
}
if( SHOW_SCROLLER )
{
if( SHARED_PREVIEW_AND_CURSOR )
fSecs = max( fSecs, OFF_COMMAND( m_Scroller[0] ) );
else
for( int p=0; p<NUM_PLAYERS; p++ )
fSecs = max( fSecs, OFF_COMMAND( m_Scroller[p] ) );
}
fSecs = max( fSecs, OFF_COMMAND( m_sprExplanation[GetCurrentPage()] ) );
fSecs = max( fSecs, OFF_COMMAND( m_sprMore[GetCurrentPage()] ) );
+7
View File
@@ -18,6 +18,7 @@
#include "RageSound.h"
#include "RandomSample.h"
#include "ActorUtil.h"
#include "ActorScroller.h"
class ScreenSelectMaster : public ScreenSelect
{
@@ -67,11 +68,17 @@ protected:
AutoActor m_sprExplanation[NUM_PAGES];
Sprite m_sprMore[NUM_PAGES];
#define MAX_ICON_PARTS 3
// icon is the piece shared, per-choice piece
AutoActor m_sprIcon[MAX_ICON_PARTS][MAX_CHOICES];
#define MAX_PREVIEW_PARTS 3
// preview is per-choice, per-player piece
AutoActor m_sprPreview[MAX_PREVIEW_PARTS][MAX_CHOICES][NUM_PLAYERS];
#define MAX_CURSOR_PARTS 3
// cursor is the per-player that's shared by all choices
Sprite m_sprCursor[MAX_CURSOR_PARTS][NUM_PLAYERS];
// scroll is the per-player, per-choice piece that's scrolled
AutoActor m_sprScroll[MAX_CHOICES][NUM_PLAYERS];
ActorScroller m_Scroller[NUM_PLAYERS];
RageSound m_soundChange;
RageSound m_soundSelect;