Make wheel items regular children (no special update/drawing);

remove "staggered tween" hack and set the offset in the
context so this can be done in commands; fix sections;
do OnCommand/OffCommand normally and rename TweenOn/OffScreen
to TweenOn/OffScreenForSort; other fixes/cleanups (metric
updates to come in a bit)
This commit is contained in:
Glenn Maynard
2006-08-10 06:27:47 +00:00
parent 8bb6233b5a
commit 208c5b0061
3 changed files with 123 additions and 222 deletions
+96 -181
View File
@@ -31,8 +31,9 @@ WheelBase::~WheelBase()
void WheelBase::Load( RString sType )
{
LOG->Trace( "WheelBase::Load('%s')", sType.c_str() );
ASSERT( this->GetNumChildren() == 0 ); // only load once
m_bEmpty = true;
m_bEmpty = false;
m_LastSelection = NULL;
m_iSelection = 0;
m_fTimeLeftInState = 0;
@@ -40,29 +41,8 @@ void WheelBase::Load( RString sType )
m_iSwitchesLeftInSpinDown = 0;
m_Moving = 0;
LoadFromMetrics( sType );
FOREACH( WheelItemBase*, m_WheelBaseItems, i )
SAFE_DELETE( *i );
m_WheelBaseItems.clear();
WheelItemBase *pTempl = MakeItem();
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
{
m_WheelBaseItems.push_back( (WheelItemBase *) pTempl->Copy() ); // XXX: ugly cast
}
SAFE_DELETE( pTempl );
}
void WheelBase::BeginScreen()
{
m_WheelState = STATE_SELECTING;
}
void WheelBase::LoadFromMetrics( RString sType )
{
SWITCH_SECONDS .Load(sType,"SwitchSeconds");
LOCKED_INITIAL_VELOCITY .Load(sType,"LockedInitialVelocity");
SCROLL_BAR_X .Load(sType,"ScrollBarX");
SCROLL_BAR_HEIGHT .Load(sType,"ScrollBarHeight");
ITEM_CURVE_X .Load(sType,"ItemCurveX");
USE_LINEAR_WHEEL .Load(sType,"NoCurving");
@@ -71,21 +51,58 @@ void WheelBase::LoadFromMetrics( RString sType )
CIRCLE_PERCENT .Load(sType,"CirclePercent");
USE_3D .Load(sType,"Use3D");
NUM_WHEEL_ITEMS_TO_DRAW .Load(sType,"NumWheelItems");
WHEEL_ITEM_ON_DELAY_OFFSET .Load(sType,"WheelItemOnDelayOffset");
WHEEL_ITEM_OFF_DELAY_OFFSET .Load(sType,"WheelItemOffDelayOffset");
WHEEL_ITEM_LOCKED_COLOR .Load(sType,"WheelItemLockedColor");
m_soundChangeMusic.Load( THEME->GetPathS(sType,"change"), true );
m_soundLocked.Load( THEME->GetPathS(sType,"locked"), true );
WheelItemBase *pTempl = MakeItem();
ActorUtil::LoadAllCommands( *pTempl, m_sName );
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
m_WheelBaseItems.push_back( (WheelItemBase *) pTempl->Copy() ); // XXX: ugly cast
SAFE_DELETE( pTempl );
// draw outside->inside
for( int i=0; i<NUM_WHEEL_ITEMS/2; i++ )
this->AddChild( m_WheelBaseItems[i] );
for( int i=NUM_WHEEL_ITEMS-1; i>=NUM_WHEEL_ITEMS/2; i-- )
this->AddChild( m_WheelBaseItems[i] );
m_sprHighlight.Load( THEME->GetPathG(sType,"highlight") );
m_sprHighlight->SetName( "Highlight" );
this->AddChild( m_sprHighlight );
ActorUtil::OnCommand( m_sprHighlight, sType );
ActorUtil::LoadAllCommands( *m_sprHighlight, m_sName );
m_ScrollBar.SetX( SCROLL_BAR_X );
m_ScrollBar.SetBarHeight( SCROLL_BAR_HEIGHT );
this->AddChild( &m_ScrollBar );
ActorUtil::LoadAllCommands( m_ScrollBar, m_sName );
{
Lua *L = LUA->Get();
m_sprHighlight->PushContext(L);
lua_pushstring( L, "WheelIndex" );
lua_pushnumber( L, NUM_WHEEL_ITEMS/2.0f );
lua_settable( L, -3 );
lua_pop( L, 1 );
LUA->Release( L );
}
Lua *L = LUA->Get();
for( int i=0; i < (int) m_WheelBaseItems.size(); i++ )
{
m_WheelBaseItems[i]->PushContext(L);
lua_pushstring( L, "WheelIndex" );
lua_pushnumber( L, i );
lua_settable( L, -3 );
lua_pop( L, 1 );
}
LUA->Release( L );
}
void WheelBase::BeginScreen()
{
m_WheelState = STATE_SELECTING;
}
void WheelBase::GetItemPosition( float fPosOffsetsFromMiddle, float& fX_out, float& fY_out, float& fZ_out, float& fRotationX_out )
@@ -134,43 +151,6 @@ void WheelBase::SetItemPosition( Actor &item, float fPosOffsetsFromMiddle )
item.SetRotationX( fRotationX );
}
void WheelBase::DrawPrimitives()
{
// draw outside->inside
for( int i=0; i<NUM_WHEEL_ITEMS/2; i++ )
DrawItem( i );
for( int i=NUM_WHEEL_ITEMS-1; i>=NUM_WHEEL_ITEMS/2; i-- )
DrawItem( i );
ActorFrame::DrawPrimitives();
}
void WheelBase::DrawItem( int i )
{
const float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS/2 + m_fPositionOffsetFromSelection;
if( fabsf(fThisBannerPositionOffsetFromSelection) > NUM_WHEEL_ITEMS_TO_DRAW/2 )
return;
WheelItemBase *display = m_WheelBaseItems[i];
switch( m_WheelState )
{
case STATE_SELECTING:
case STATE_LOCKED:
case STATE_ROULETTE_SPINNING:
case STATE_ROULETTE_SLOWING_DOWN:
case STATE_RANDOM_SPINNING:
SetItemPosition( *display, fThisBannerPositionOffsetFromSelection );
break;
}
if( m_WheelState == STATE_LOCKED && i != NUM_WHEEL_ITEMS/2 )
display->m_colorLocked = WHEEL_ITEM_LOCKED_COLOR.GetValue();
else
display->m_colorLocked = RageColor(0,0,0,0);
display->Draw();
}
void WheelBase::UpdateScrollbar()
{
int iTotalNumItems = m_CurWheelItemData.size();
@@ -207,7 +187,33 @@ void WheelBase::Update( float fDeltaTime )
{
ActorFrame::Update( fDeltaTime );
UpdateItems( fDeltaTime );
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
{
WheelItemBase *pDisplay = m_WheelBaseItems[i];
const float fOffsetFromSelection = i - NUM_WHEEL_ITEMS/2 + m_fPositionOffsetFromSelection;
if( fabsf(fOffsetFromSelection) > NUM_WHEEL_ITEMS_TO_DRAW/2 )
{
pDisplay->SetHidden( true );
continue;
}
pDisplay->SetHidden( false );
switch( m_WheelState )
{
case STATE_SELECTING:
case STATE_LOCKED:
case STATE_ROULETTE_SPINNING:
case STATE_ROULETTE_SLOWING_DOWN:
case STATE_RANDOM_SPINNING:
SetItemPosition( *pDisplay, fOffsetFromSelection );
break;
}
if( m_WheelState == STATE_LOCKED && i != NUM_WHEEL_ITEMS/2 )
pDisplay->m_colorLocked = WHEEL_ITEM_LOCKED_COLOR.GetValue();
else
pDisplay->m_colorLocked = RageColor(0,0,0,0);
}
//Moved to CommonUpdateProcedure, seems to work fine
//Revert if it happens to break something
@@ -303,14 +309,6 @@ void WheelBase::Update( float fDeltaTime )
}
}
void WheelBase::UpdateItems( float fDeltaTime )
{
for( unsigned i = 0; i < unsigned(NUM_WHEEL_ITEMS); i++)
{
m_WheelBaseItems[i]->Update( fDeltaTime );
}
}
void WheelBase::UpdateSwitch()
{
switch( m_WheelState )
@@ -351,30 +349,30 @@ bool WheelBase::Select() // return true if this selection can end the screen
m_Moving = 0;
if( !m_bEmpty )
{
switch( m_CurWheelItemData[m_iSelection]->m_Type )
{
case TYPE_GENERIC:
m_LastSelection = m_CurWheelItemData[m_iSelection];
return false;
case TYPE_SECTION:
{
RString sThisItemSectionName = m_CurWheelItemData[m_iSelection]->m_sText;
if( m_sExpandedSectionName == sThisItemSectionName ) // already expanded
SetOpenGroup( "" ); // collapse it
else // already collapsed
SetOpenGroup( sThisItemSectionName ); // expand it
if( m_bEmpty )
return false;
m_soundExpand.Play();
}
return false;
default:
ASSERT(0);
return false;
switch( m_CurWheelItemData[m_iSelection]->m_Type )
{
case TYPE_GENERIC:
m_LastSelection = m_CurWheelItemData[m_iSelection];
break;
case TYPE_SECTION:
{
RString sThisItemSectionName = m_CurWheelItemData[m_iSelection]->m_sText;
if( m_sExpandedSectionName == sThisItemSectionName ) // already expanded
SetOpenGroup( "" ); // collapse it
else // already collapsed
SetOpenGroup( sThisItemSectionName ); // expand it
m_soundExpand.Play();
}
break;
default:
break;
}
return false;
return true;
}
// return true if this selection ends the screen
@@ -391,103 +389,20 @@ int WheelBase::IsMoving() const
return m_Moving && m_TimeBeforeMovingBegins == 0;
}
void WheelBase::TweenOnScreen( bool bChangingSort )
void WheelBase::TweenOnScreenForSort()
{
m_WheelState = STATE_TWEENING_ON_SCREEN;
SetItemPosition( *m_sprHighlight, 0 );
COMMAND( m_sprHighlight, "StartOn");
if( bChangingSort )
{
const float delay = fabsf(NUM_WHEEL_ITEMS/2.0f) * WHEEL_ITEM_ON_DELAY_OFFSET;
m_sprHighlight->BeginTweening( delay ); // sleep
COMMAND( m_sprHighlight, "FinishOnSort");
}
else
{
COMMAND( m_sprHighlight, "FinishOn");
}
m_ScrollBar.SetX( SCROLL_BAR_X );
m_ScrollBar.AddX( 30 );
if( bChangingSort )
m_ScrollBar.BeginTweening( 0.2f ); // sleep
else
m_ScrollBar.BeginTweening( 0.7f ); // sleep
m_ScrollBar.BeginTweening( 0.2f , TWEEN_ACCELERATE );
m_ScrollBar.AddX( -30 );
TweenOnScreenUpdateItems( bChangingSort );
if( bChangingSort )
HurryTweening( 0.25f );
COMMAND( this, "SortOn" );
m_fTimeLeftInState = GetTweenTimeLeft() + 0.100f;
}
void WheelBase::TweenOnScreenUpdateItems( bool bChangingSort )
{
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
{
WheelItemBase *display = m_WheelBaseItems[i];
float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS/2 + m_fPositionOffsetFromSelection;
SetItemPosition( *display, fThisBannerPositionOffsetFromSelection );
COMMAND( display, "StartOn");
const float delay = fabsf((float)i) * WHEEL_ITEM_ON_DELAY_OFFSET;
display->BeginTweening( delay ); // sleep
COMMAND( display, "FinishOn");
if( bChangingSort )
display->HurryTweening( 0.25f );
}
}
void WheelBase::TweenOffScreenUpdateItems( bool bChangingSort )
{
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
{
WheelItemBase *display = m_WheelBaseItems[i];
float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS/2 + m_fPositionOffsetFromSelection;
SetItemPosition( *display, fThisBannerPositionOffsetFromSelection );
COMMAND( display, "StartOff");
const float delay = fabsf((float)i) * WHEEL_ITEM_OFF_DELAY_OFFSET;
display->BeginTweening( delay ); // sleep
COMMAND( display, "FinishOff");
if( bChangingSort )
display->HurryTweening( 0.25f );
}
}
void WheelBase::TweenOffScreen( bool bChangingSort )
void WheelBase::TweenOffScreenForSort()
{
m_WheelState = STATE_TWEENING_OFF_SCREEN;
SetItemPosition( *m_sprHighlight, 0 );
COMMAND( m_sprHighlight, "StartOff");
if( bChangingSort )
{
/* When changing sort, tween the overlay with the item in the center;
* having it separate looks messy when we're moving fast. */
const float delay = fabsf(NUM_WHEEL_ITEMS/2.0f) * WHEEL_ITEM_ON_DELAY_OFFSET;
m_sprHighlight->BeginTweening( delay ); // sleep
COMMAND( m_sprHighlight, "FinishOffSort");
}
else
{
COMMAND( m_sprHighlight, "FinishOff");
}
m_ScrollBar.BeginTweening( 0 );
m_ScrollBar.BeginTweening( 0.2f, TWEEN_ACCELERATE );
m_ScrollBar.SetX( SCROLL_BAR_X+30 );
TweenOffScreenUpdateItems( bChangingSort );
if( bChangingSort )
HurryTweening( 0.25f );
COMMAND( this, "SortOff" );
m_fTimeLeftInState = GetTweenTimeLeft() + 0.100f;
}
@@ -631,7 +546,7 @@ void WheelBase::RebuildWheelItems( int iDist )
}
}
WheelItemBaseData* WheelBase::LastSelected( )
WheelItemBaseData* WheelBase::LastSelected()
{
if( m_bEmpty )
return NULL;