play Gain/LoseFocus before OnCommand
This commit is contained in:
Chris Danford
2005-06-29 09:22:24 +00:00
parent d1d61b2070
commit 738b938f5a
+126 -170
View File
@@ -72,73 +72,53 @@ void ScreenSelectMaster::Init()
m_bChosen[p] = false; m_bChosen[p] = false;
} }
// init cursor
vector<PlayerNumber> vpns;
if( SHARED_PREVIEW_AND_CURSOR ) if( SHARED_PREVIEW_AND_CURSOR )
{ {
for( int i=0; i<NUM_CURSOR_PARTS; i++ ) vpns.push_back( (PlayerNumber)0 );
{
m_sprCursor[i][0].Load( THEME->GetPathG(m_sName,ssprintf("Cursor Part%d",i+1)) );
m_sprCursor[i][0]->SetName( ssprintf("CursorPart%d",i+1) );
this->AddChild( m_sprCursor[i][0] );
}
} }
else else
{ {
for( int i=0; i<NUM_CURSOR_PARTS; i++ ) FOREACH_HumanPlayer( p )
vpns.push_back( p );
}
#define APPEND_STRING_WITH_SPACE(p) (SHARED_PREVIEW_AND_CURSOR ? CString() : ssprintf(" P%d",(p)+1))
#define APPEND_STRING_NO_SPACE(p) (SHARED_PREVIEW_AND_CURSOR ? CString() : ssprintf("P%d",(p)+1))
// init cursor
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
{
FOREACH( PlayerNumber, vpns, p )
{ {
FOREACH_HumanPlayer( p ) m_sprCursor[i][*p].Load( THEME->GetPathG(m_sName,ssprintf("Cursor Part%d",i+1)+APPEND_STRING_WITH_SPACE(*p)) );
{ m_sprCursor[i][*p]->SetName( ssprintf("CursorPart%d",i+1)+APPEND_STRING_NO_SPACE(*p) );
m_sprCursor[i][p].Load( THEME->GetPathG(m_sName,ssprintf("Cursor Part%d P%d",i+1,p+1)) ); this->AddChild( m_sprCursor[i][*p] );
m_sprCursor[i][p]->SetName( ssprintf("CursorPart%dP%d",i+1,p+1) );
this->AddChild( m_sprCursor[i][p] );
}
} }
} }
// init scroll // init scroll
if( SHOW_SCROLLER ) if( SHOW_SCROLLER )
{ {
if( SHARED_PREVIEW_AND_CURSOR ) FOREACH( PlayerNumber, vpns, p )
{ {
m_Scroller[0].Load3( m_Scroller[*p].Load3(
SCROLLER_SECONDS_PER_ITEM, SCROLLER_SECONDS_PER_ITEM,
SCROLLER_NUM_ITEMS_TO_DRAW, SCROLLER_NUM_ITEMS_TO_DRAW,
SCROLLER_FAST_CATCHUP, SCROLLER_FAST_CATCHUP,
SCROLLER_TRANSFORM, SCROLLER_TRANSFORM,
false ); false );
m_Scroller[0].SetName( "Scroller" ); m_Scroller[*p].SetName( "Scroller"+APPEND_STRING_NO_SPACE(*p) );
this->AddChild( &m_Scroller[0] ); this->AddChild( &m_Scroller[*p] );
for( unsigned c=0; c<m_aGameCommands.size(); c++ ) for( unsigned c=0; c<m_aGameCommands.size(); c++ )
{ {
const GameCommand& mc = m_aGameCommands[c]; const GameCommand& mc = m_aGameCommands[c];
m_sprScroll[c][0].Load( THEME->GetPathG(m_sName,ssprintf("Scroll Choice%s",mc.m_sName.c_str())) ); m_sprScroll[c][*p].Load( THEME->GetPathG(m_sName,ssprintf("Scroll Choice%s",mc.m_sName.c_str())+APPEND_STRING_WITH_SPACE(*p)) );
m_sprScroll[c][0]->SetName( ssprintf("Scroll") ); m_sprScroll[c][*p]->SetName( "Scroll"+APPEND_STRING_NO_SPACE(*p) );
m_Scroller[0].AddChild( m_sprScroll[c][0] ); m_Scroller[*p].AddChild( m_sprScroll[c][*p] );
}
}
else
{
FOREACH_HumanPlayer( p )
{
m_Scroller[p].Load3(
SCROLLER_SECONDS_PER_ITEM,
SCROLLER_NUM_ITEMS_TO_DRAW,
SCROLLER_FAST_CATCHUP,
SCROLLER_TRANSFORM,
false );
m_Scroller[p].SetName( ssprintf("ScrollerP%d",p+1) );
this->AddChild( &m_Scroller[p] );
for( unsigned c=0; c<m_aGameCommands.size(); c++ )
{
const GameCommand& mc = m_aGameCommands[c];
m_sprScroll[c][p].Load( THEME->GetPathG(m_sName,ssprintf("Scroll Choice%s P%d",mc.m_sName.c_str(),p+1)) );
m_sprScroll[c][p]->SetName( ssprintf("ScrollP%d",p+1) );
m_Scroller[p].AddChild( m_sprScroll[c][p] );
}
} }
} }
} }
@@ -156,25 +136,13 @@ void ScreenSelectMaster::Init()
} }
// init preview // init preview
if( SHARED_PREVIEW_AND_CURSOR ) FOREACH( PlayerNumber, vpns, p )
{ {
for( int i=0; i<NUM_PREVIEW_PARTS; i++ ) for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
{ {
m_sprPreview[i][c][0].Load( THEME->GetPathG(m_sName,ssprintf("Preview Part%d Choice%s",i+1,mc.m_sName.c_str())) ); m_sprPreview[i][c][*p].Load( THEME->GetPathG(m_sName,ssprintf("Preview Part%d Choice%s",i+1,mc.m_sName.c_str())+APPEND_STRING_NO_SPACE(*p)) );
m_sprPreview[i][c][0]->SetName( ssprintf("PreviewPart%d",i+1) ); m_sprPreview[i][c][*p]->SetName( ssprintf("PreviewPart%d",i+1)+APPEND_STRING_NO_SPACE(*p) );
this->AddChild( m_sprPreview[i][c][0] ); this->AddChild( m_sprPreview[i][c][*p] );
}
}
else
{
FOREACH_HumanPlayer( p )
{
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
{
m_sprPreview[i][c][p].Load( THEME->GetPathG(m_sName,ssprintf("Preview Part%d Choice%s P%d",i+1,mc.m_sName.c_str(),p+1)) );
m_sprPreview[i][c][p]->SetName( ssprintf("PreviewPart%dP%d",i+1,p+1) );
this->AddChild( m_sprPreview[i][c][p] );
}
} }
} }
} }
@@ -274,37 +242,39 @@ void ScreenSelectMaster::HandleScreenMessage( const ScreenMessage SM )
{ {
ScreenSelect::HandleScreenMessage( SM ); ScreenSelect::HandleScreenMessage( SM );
vector<PlayerNumber> vpns;
if( SHARED_PREVIEW_AND_CURSOR )
{
vpns.push_back( (PlayerNumber)0 );
}
else
{
FOREACH_HumanPlayer( p )
vpns.push_back( p );
}
if( SM == SM_PlayPostSwitchPage ) if( SM == SM_PlayPostSwitchPage )
{ {
if( SHARED_PREVIEW_AND_CURSOR ) for( int i=0; i<NUM_CURSOR_PARTS; i++ )
{ {
for( int i=0; i<NUM_CURSOR_PARTS; i++ ) FOREACH( PlayerNumber, vpns, p )
{ {
m_sprCursor[i][0]->SetXY( GetCursorX((PlayerNumber)0,i), GetCursorY((PlayerNumber)0,i) ); m_sprCursor[i][*p]->SetXY( GetCursorX(*p,i), GetCursorY(*p,i) );
COMMAND( m_sprCursor[i][0], "PostSwitchPage" ); COMMAND( m_sprCursor[i][*p], "PostSwitchPage" );
} }
} }
else
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
{ {
for( int i=0; i<NUM_CURSOR_PARTS; i++ ) FOREACH( PlayerNumber, vpns, p )
FOREACH_HumanPlayer( p ) {
{ int iChoice = m_iChoice[*p];
m_sprCursor[i][p]->SetXY( GetCursorX(p,i), GetCursorY(p,i) ); COMMAND( m_sprPreview[i][iChoice][*p], "PostSwitchPage" );
COMMAND( m_sprCursor[i][p], "PostSwitchPage" ); }
}
} }
if( SHARED_PREVIEW_AND_CURSOR )
{
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
COMMAND( m_sprPreview[i][m_iChoice[0]][0], "PostSwitchPage" );
}
else
{
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
FOREACH_HumanPlayer( p )
COMMAND( m_sprPreview[i][m_iChoice[p]][p], "PostSwitchPage" );
}
m_fLockInputSecs = POST_SWITCH_PAGE_SECONDS; m_fLockInputSecs = POST_SWITCH_PAGE_SECONDS;
} }
else if( SM == SM_BeginFadingOut ) else if( SM == SM_BeginFadingOut )
@@ -346,22 +316,26 @@ int ScreenSelectMaster::GetSelectionIndex( PlayerNumber pn )
void ScreenSelectMaster::UpdateSelectableChoices() void ScreenSelectMaster::UpdateSelectableChoices()
{ {
vector<PlayerNumber> vpns;
if( SHARED_PREVIEW_AND_CURSOR )
{
vpns.push_back( (PlayerNumber)0 );
}
else
{
FOREACH_HumanPlayer( p )
vpns.push_back( p );
}
for( unsigned c=0; c<m_aGameCommands.size(); c++ ) for( unsigned c=0; c<m_aGameCommands.size(); c++ )
{ {
for( int i=0; i<NUM_ICON_PARTS; i++ ) for( int i=0; i<NUM_ICON_PARTS; i++ )
COMMAND( m_sprIcon[i][c], m_aGameCommands[c].IsPlayable()? "Enabled":"Disabled" ); COMMAND( m_sprIcon[i][c], m_aGameCommands[c].IsPlayable()? "Enabled":"Disabled" );
if( SHARED_PREVIEW_AND_CURSOR ) FOREACH( PlayerNumber, vpns, p )
{ if( m_sprScroll[c][*p].IsLoaded() )
if( m_sprScroll[c][0].IsLoaded() ) m_sprScroll[c][*p]->PlayCommand( m_aGameCommands[c].IsPlayable()? "Enabled":"Disabled" );
m_sprScroll[c][0]->PlayCommand( m_aGameCommands[c].IsPlayable()? "Enabled":"Disabled" );
}
else
{
FOREACH_HumanPlayer( p )
if( m_sprScroll[c][p].IsLoaded() )
m_sprScroll[c][p]->PlayCommand( m_aGameCommands[c].IsPlayable()? "Enabled":"Disabled" );
}
} }
/* /*
@@ -471,22 +445,29 @@ bool ScreenSelectMaster::ChangePage( int iNewChoice )
// If anyone has already chosen, don't allow changing of pages // If anyone has already chosen, don't allow changing of pages
FOREACH_PlayerNumber( p ) FOREACH_PlayerNumber( p )
{
if( GAMESTATE->IsHumanPlayer(p) && m_bChosen[p] ) if( GAMESTATE->IsHumanPlayer(p) && m_bChosen[p] )
return false; return false;
}
vector<PlayerNumber> vpns;
if( SHARED_PREVIEW_AND_CURSOR ) if( SHARED_PREVIEW_AND_CURSOR )
{ {
for( int i=0; i<NUM_CURSOR_PARTS; i++ ) vpns.push_back( (PlayerNumber)0 );
COMMAND( m_sprCursor[i][0], "PreSwitchPage" );
} }
else else
{ {
for( int i=0; i<NUM_CURSOR_PARTS; i++ ) FOREACH_HumanPlayer( p )
FOREACH_PlayerNumber( p ) vpns.push_back( p );
if( GAMESTATE->IsHumanPlayer(p) )
COMMAND( m_sprCursor[i][p], "PreSwitchPage" );
} }
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
FOREACH( PlayerNumber, vpns, p )
if( GAMESTATE->IsHumanPlayer(*p) )
COMMAND( m_sprCursor[i][*p], "PreSwitchPage" );
const CString sIconAndExplanationCommand = ssprintf( "SwitchToPage%d", newPage+1 ); const CString sIconAndExplanationCommand = ssprintf( "SwitchToPage%d", newPage+1 );
for( unsigned c=0; c<m_aGameCommands.size(); c++ ) for( unsigned c=0; c<m_aGameCommands.size(); c++ )
@@ -763,6 +744,17 @@ void ScreenSelectMaster::MenuStart( PlayerNumber pn )
*/ */
void ScreenSelectMaster::TweenOnScreen() void ScreenSelectMaster::TweenOnScreen()
{ {
vector<PlayerNumber> vpns;
if( SHARED_PREVIEW_AND_CURSOR )
{
vpns.push_back( (PlayerNumber)0 );
}
else
{
FOREACH_HumanPlayer( p )
vpns.push_back( p );
}
for( unsigned c=0; c<m_aGameCommands.size(); c++ ) for( unsigned c=0; c<m_aGameCommands.size(); c++ )
{ {
for( int i=0; i<NUM_ICON_PARTS; i++ ) for( int i=0; i<NUM_ICON_PARTS; i++ )
@@ -772,64 +764,38 @@ void ScreenSelectMaster::TweenOnScreen()
SET_XY_AND_ON_COMMAND( m_sprIcon[i][c] ); SET_XY_AND_ON_COMMAND( m_sprIcon[i][c] );
} }
if( SHARED_PREVIEW_AND_CURSOR ) FOREACH( PlayerNumber, vpns, p )
{ {
int p=0;
for( int i=0; i<NUM_PREVIEW_PARTS; i++ ) for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
{ {
COMMAND( m_sprPreview[i][c][p], (int(c) == m_iChoice[p])? "GainFocus":"LoseFocus" ); COMMAND( m_sprPreview[i][c][*p], (int(c) == m_iChoice[*p])? "GainFocus":"LoseFocus" );
m_sprPreview[i][c][p]->FinishTweening(); m_sprPreview[i][c][*p]->FinishTweening();
SET_XY_AND_ON_COMMAND( m_sprPreview[i][c][p] ); SET_XY_AND_ON_COMMAND( m_sprPreview[i][c][*p] );
} }
} }
else
{
FOREACH_HumanPlayer( p )
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
{
COMMAND( m_sprPreview[i][c][p], int(c) == m_iChoice[p]? "GainFocus":"LoseFocus" );
m_sprPreview[i][c][p]->FinishTweening();
SET_XY_AND_ON_COMMAND( m_sprPreview[i][c][p] );
}
}
} }
// Need to SetXY of Cursor after Icons since it depends on the Icons' positions. // Need to SetXY of Cursor after Icons since it depends on the Icons' positions.
if( SHARED_PREVIEW_AND_CURSOR ) for( int i=0; i<NUM_CURSOR_PARTS; i++ )
{ {
for( int i=0; i<NUM_CURSOR_PARTS; i++ ) FOREACH( PlayerNumber, vpns, p )
{ {
m_sprCursor[i][0]->SetXY( GetCursorX((PlayerNumber)0,i), GetCursorY((PlayerNumber)0,i) ); m_sprCursor[i][*p]->SetXY( GetCursorX(*p,i), GetCursorY(*p,i) );
ON_COMMAND( m_sprCursor[i][0] ); ON_COMMAND( m_sprCursor[i][*p] );
} }
} }
else
{
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
FOREACH_HumanPlayer( p )
{
m_sprCursor[i][p]->SetXY( GetCursorX(p,i), GetCursorY(p,i) );
ON_COMMAND( m_sprCursor[i][p] );
}
}
if( SHOW_SCROLLER ) if( SHOW_SCROLLER )
{ {
if( SHARED_PREVIEW_AND_CURSOR ) FOREACH( PlayerNumber, vpns, p )
{ {
m_Scroller[0].SetCurrentAndDestinationItem( (float)m_iChoice[0] ); // Play Gain/LoseFocus before playing the on command. Gain/Lose will
SET_XY_AND_ON_COMMAND( m_Scroller[0] ); // often stop tweening, which ruins the OnCommand.
for( unsigned c=0; c<m_aGameCommands.size(); c++ ) for( unsigned c=0; c<m_aGameCommands.size(); c++ )
COMMAND( *m_sprScroll[c][0], int(c) == m_iChoice[0]? "GainFocus":"LoseFocus" ); COMMAND( *m_sprScroll[c][*p], int(c) == m_iChoice[*p]? "GainFocus":"LoseFocus" );
m_Scroller[*p].SetCurrentAndDestinationItem( (float)m_iChoice[*p] );
SET_XY_AND_ON_COMMAND( m_Scroller[*p] );
} }
else
FOREACH_HumanPlayer( p )
{
m_Scroller[p].SetCurrentAndDestinationItem( (float)m_iChoice[p] );
SET_XY_AND_ON_COMMAND( m_Scroller[p] );
for( unsigned c=0; c<m_aGameCommands.size(); c++ )
COMMAND( *m_sprScroll[c][p], int(c) == m_iChoice[p]? "GainFocus":"LoseFocus" );
}
} }
//We have to move page two's explanation and more off the screen //We have to move page two's explanation and more off the screen
@@ -849,33 +815,33 @@ void ScreenSelectMaster::TweenOnScreen()
void ScreenSelectMaster::TweenOffScreen() void ScreenSelectMaster::TweenOffScreen()
{ {
vector<PlayerNumber> vpns;
if( SHARED_PREVIEW_AND_CURSOR ) if( SHARED_PREVIEW_AND_CURSOR )
{ {
for( int i=0; i<NUM_CURSOR_PARTS; i++ ) vpns.push_back( (PlayerNumber)0 );
OFF_COMMAND( m_sprCursor[i][0] );
} }
else else
{ {
for( int i=0; i<NUM_CURSOR_PARTS; i++ ) FOREACH_HumanPlayer( p )
FOREACH_HumanPlayer( p ) vpns.push_back( p );
OFF_COMMAND( m_sprCursor[i][p] );
} }
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
FOREACH( PlayerNumber, vpns, p )
OFF_COMMAND( m_sprCursor[i][*p] );
for( unsigned c=0; c<m_aGameCommands.size(); c++ ) for( unsigned c=0; c<m_aGameCommands.size(); c++ )
{ {
if( GetPage(c) != GetCurrentPage() ) if( GetPage(c) != GetCurrentPage() )
continue; // skip continue; // skip
bool SelectedByEitherPlayer = false; bool SelectedByEitherPlayer = false;
if( SHARED_PREVIEW_AND_CURSOR ) FOREACH( PlayerNumber, vpns, p )
{ {
if( m_iChoice[0] == (int)c ) if( m_iChoice[*p] == (int)c )
SelectedByEitherPlayer = true; SelectedByEitherPlayer = true;
} }
else
FOREACH_HumanPlayer( p )
if( m_iChoice[p] == (int)c )
SelectedByEitherPlayer = true;
for( int i=0; i<NUM_ICON_PARTS; i++ ) for( int i=0; i<NUM_ICON_PARTS; i++ )
{ {
@@ -884,32 +850,20 @@ void ScreenSelectMaster::TweenOffScreen()
} }
if( SHARED_PREVIEW_AND_CURSOR ) for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
{ {
for( int i=0; i<NUM_PREVIEW_PARTS; i++ ) FOREACH( PlayerNumber, vpns, p )
{ {
OFF_COMMAND( m_sprPreview[i][c][0] ); OFF_COMMAND( m_sprPreview[i][c][*p] );
COMMAND( m_sprPreview[i][c][0], SelectedByEitherPlayer? "OffFocused":"OffUnfocused" ); COMMAND( m_sprPreview[i][c][*p], SelectedByEitherPlayer? "OffFocused":"OffUnfocused" );
} }
} }
else
{
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
FOREACH_HumanPlayer( p )
{
OFF_COMMAND( m_sprPreview[i][c][p] );
COMMAND( m_sprPreview[i][c][0], SelectedByEitherPlayer? "OffFocused":"OffUnfocused" );
}
}
} }
if( SHOW_SCROLLER ) if( SHOW_SCROLLER )
{ {
if( SHARED_PREVIEW_AND_CURSOR ) FOREACH( PlayerNumber, vpns, p )
OFF_COMMAND( m_Scroller[0] ); OFF_COMMAND( m_Scroller[*p] );
else
FOREACH_PlayerNumber( p )
OFF_COMMAND( m_Scroller[p] );
} }
OFF_COMMAND( m_sprExplanation[GetCurrentPage()] ); OFF_COMMAND( m_sprExplanation[GetCurrentPage()] );
@@ -919,12 +873,14 @@ void ScreenSelectMaster::TweenOffScreen()
float ScreenSelectMaster::GetCursorX( PlayerNumber pn, int iPartIndex ) float ScreenSelectMaster::GetCursorX( PlayerNumber pn, int iPartIndex )
{ {
return m_sprIcon[0][m_iChoice[pn]]->GetX() + CURSOR_OFFSET_X_FROM_ICON.GetValue(pn, iPartIndex); int iChoice = m_iChoice[pn];
return m_sprIcon[0][iChoice]->GetX() + CURSOR_OFFSET_X_FROM_ICON.GetValue(pn, iPartIndex);
} }
float ScreenSelectMaster::GetCursorY( PlayerNumber pn, int iPartIndex ) float ScreenSelectMaster::GetCursorY( PlayerNumber pn, int iPartIndex )
{ {
return m_sprIcon[0][m_iChoice[pn]]->GetY() + CURSOR_OFFSET_Y_FROM_ICON.GetValue(pn, iPartIndex); int iChoice = m_iChoice[pn];
return m_sprIcon[0][iChoice]->GetY() + CURSOR_OFFSET_Y_FROM_ICON.GetValue(pn, iPartIndex);
} }
/* /*