Add "scroller" to ScreenSelectOptionsMaster
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,8 @@ public:
|
||||
virtual void SortByZ();
|
||||
|
||||
virtual ~ActorFrame() { }
|
||||
|
||||
void DeleteAllChildren();
|
||||
|
||||
virtual void RunCommandOnChildren( const CString &cmd ); /* but not on self */
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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()] ) );
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user