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
+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();
}