Some Changes to ScrollingList to support different display modes on the music select screen.
This commit is contained in:
+168
-35
@@ -18,6 +18,26 @@
|
||||
#include "PrefsManager.h"
|
||||
#include "Course.h"
|
||||
#include "SongManager.h"
|
||||
#include "ThemeManager.h"
|
||||
|
||||
enum BANNER_PREFS_TYPES
|
||||
{
|
||||
BANNERPREFS_DDRFLAT=0,
|
||||
BANNERPREFS_DDRROT,
|
||||
BANNERPREFS_EZ2,
|
||||
BANNERPREFS_PUMP,
|
||||
BANNERPREFS_PARA
|
||||
};
|
||||
|
||||
#define BANNER_WIDTH THEME->GetMetricF("ScreenSelectMusic","BannerWidth")
|
||||
#define BANNER_HEIGHT THEME->GetMetricF("ScreenSelectMusic","BannerHeight")
|
||||
#define EZ2_BANNER_WIDTH 92
|
||||
#define EZ2_BANNER_HEIGHT 92
|
||||
#define EZ2_BANNER_ZOOM 2.0
|
||||
|
||||
#define SPRITE_TYPE_SPRITE 0
|
||||
#define SPRITE_TYPE_CROPPEDSPRITE 1
|
||||
#define DDRROT_ROTATION 315
|
||||
|
||||
const int DEFAULT_VISIBLE_ELEMENTS = 9;
|
||||
const int DEFAULT_SPACING = 300;
|
||||
@@ -32,12 +52,19 @@ Initializes Variables for the ScrollingList
|
||||
****************************************/
|
||||
ScrollingList::ScrollingList()
|
||||
{
|
||||
m_iBannerPrefs = BANNERPREFS_EZ2;
|
||||
m_iSpriteType = SPRITE_TYPE_SPRITE;
|
||||
m_iSelection = 0;
|
||||
m_fSelectionLag = 0;
|
||||
m_iSpacing = DEFAULT_SPACING;
|
||||
m_iNumVisible = DEFAULT_VISIBLE_ELEMENTS;
|
||||
}
|
||||
|
||||
void ScrollingList::UseSpriteType(int NewSpriteType)
|
||||
{
|
||||
m_iSpriteType = NewSpriteType;
|
||||
}
|
||||
|
||||
ScrollingList::~ScrollingList()
|
||||
{
|
||||
Unload();
|
||||
@@ -45,9 +72,18 @@ ScrollingList::~ScrollingList()
|
||||
|
||||
void ScrollingList::Unload()
|
||||
{
|
||||
for( unsigned i=0; i<m_apSprites.size(); i++ )
|
||||
delete m_apSprites[i];
|
||||
m_apSprites.clear();
|
||||
if(m_iSpriteType == SPRITE_TYPE_SPRITE)
|
||||
{
|
||||
for( unsigned i=0; i<m_apSprites.size(); i++ )
|
||||
delete m_apSprites[i];
|
||||
m_apSprites.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
for( unsigned i=0; i<m_apCSprites.size(); i++ )
|
||||
delete m_apCSprites[i];
|
||||
m_apCSprites.clear();
|
||||
}
|
||||
}
|
||||
|
||||
/************************************
|
||||
@@ -56,12 +92,40 @@ in the scrolling list
|
||||
*************************************/
|
||||
void ScrollingList::Load( const CStringArray& asGraphicPaths )
|
||||
{
|
||||
RageTexturePrefs prefs;
|
||||
|
||||
Unload();
|
||||
for( unsigned i=0; i<asGraphicPaths.size(); i++ )
|
||||
if(m_iSpriteType == SPRITE_TYPE_SPRITE)
|
||||
{
|
||||
Sprite* pNewSprite = new Sprite;
|
||||
pNewSprite->Load( asGraphicPaths[i] );
|
||||
m_apSprites.push_back( pNewSprite );
|
||||
for( unsigned i=0; i<asGraphicPaths.size(); i++ )
|
||||
{
|
||||
Sprite* pNewSprite = new Sprite;
|
||||
pNewSprite->Load( asGraphicPaths[i] );
|
||||
m_apSprites.push_back( pNewSprite );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for( unsigned i=0; i<asGraphicPaths.size(); i++ )
|
||||
{
|
||||
CroppedSprite* pNewCSprite = new CroppedSprite;
|
||||
if(m_iBannerPrefs == BANNERPREFS_DDRFLAT)
|
||||
{
|
||||
pNewCSprite->SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT );
|
||||
}
|
||||
else if(m_iBannerPrefs == BANNERPREFS_DDRROT)
|
||||
{
|
||||
pNewCSprite->SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT );
|
||||
pNewCSprite->SetRotation( DDRROT_ROTATION );
|
||||
}
|
||||
else if(m_iBannerPrefs == BANNERPREFS_EZ2)
|
||||
{
|
||||
pNewCSprite->SetCroppedSize( EZ2_BANNER_WIDTH*2, EZ2_BANNER_HEIGHT*2 );
|
||||
}
|
||||
|
||||
pNewCSprite->Load( asGraphicPaths[i], prefs );
|
||||
m_apCSprites.push_back( pNewCSprite );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,10 +137,20 @@ Make the entire list shuffle left
|
||||
**************************************/
|
||||
void ScrollingList::Left()
|
||||
{
|
||||
ASSERT( !m_apSprites.empty() ); // nothing loaded!
|
||||
if(m_iSpriteType == SPRITE_TYPE_SPRITE)
|
||||
{
|
||||
ASSERT( !m_apSprites.empty() ); // nothing loaded!
|
||||
|
||||
m_iSelection = (m_iSelection + m_apSprites.size() - 1) % m_apSprites.size(); // decrement with wrapping
|
||||
m_fSelectionLag -= 1;
|
||||
m_iSelection = (m_iSelection + m_apSprites.size() - 1) % m_apSprites.size(); // decrement with wrapping
|
||||
m_fSelectionLag -= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT( !m_apCSprites.empty() ); // nothing loaded!
|
||||
|
||||
m_iSelection = (m_iSelection + m_apCSprites.size() - 1) % m_apCSprites.size(); // decrement with wrapping
|
||||
m_fSelectionLag -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************
|
||||
@@ -86,10 +160,20 @@ Make the entire list shuffle right
|
||||
**************************************/
|
||||
void ScrollingList::Right()
|
||||
{
|
||||
ASSERT( !m_apSprites.empty() ); // nothing loaded!
|
||||
if(m_iSpriteType == SPRITE_TYPE_SPRITE)
|
||||
{
|
||||
ASSERT( !m_apSprites.empty() ); // nothing loaded!
|
||||
|
||||
m_iSelection = (m_iSelection + 1) % m_apSprites.size(); // increment with wrapping
|
||||
m_fSelectionLag += 1;
|
||||
m_iSelection = (m_iSelection + 1) % m_apSprites.size(); // increment with wrapping
|
||||
m_fSelectionLag += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT( !m_apCSprites.empty() ); // nothing loaded!
|
||||
|
||||
m_iSelection = (m_iSelection + 1) % m_apCSprites.size(); // increment with wrapping
|
||||
m_fSelectionLag += 1;
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************
|
||||
@@ -132,9 +216,16 @@ Updates the actorframe
|
||||
void ScrollingList::Update( float fDeltaTime )
|
||||
{
|
||||
ActorFrame::Update( fDeltaTime );
|
||||
|
||||
if( m_apSprites.empty() )
|
||||
return;
|
||||
if(m_iSpriteType == SPRITE_TYPE_SPRITE)
|
||||
{
|
||||
if( m_apSprites.empty() )
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( m_apCSprites.empty() )
|
||||
return;
|
||||
}
|
||||
|
||||
// update m_fLaggingSelection
|
||||
if( m_fSelectionLag != 0 )
|
||||
@@ -149,8 +240,16 @@ void ScrollingList::Update( float fDeltaTime )
|
||||
m_fSelectionLag = 0; // snap
|
||||
}
|
||||
|
||||
for( unsigned i=0; i<m_apSprites.size(); i++ )
|
||||
m_apSprites[i]->Update( fDeltaTime );
|
||||
if(m_iSpriteType == SPRITE_TYPE_SPRITE)
|
||||
{
|
||||
for( unsigned i=0; i<m_apSprites.size(); i++ )
|
||||
m_apSprites[i]->Update( fDeltaTime );
|
||||
}
|
||||
else
|
||||
{
|
||||
for( unsigned i=0; i<m_apCSprites.size(); i++ )
|
||||
m_apCSprites[i]->Update( fDeltaTime );
|
||||
}
|
||||
}
|
||||
|
||||
/********************************
|
||||
@@ -160,33 +259,67 @@ Draws the elements onto the screen
|
||||
*********************************/
|
||||
void ScrollingList::DrawPrimitives()
|
||||
{
|
||||
ASSERT( !m_apSprites.empty() );
|
||||
if(m_iSpriteType == SPRITE_TYPE_SPRITE)
|
||||
{
|
||||
ASSERT( !m_apSprites.empty() );
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT( !m_apCSprites.empty() );
|
||||
}
|
||||
|
||||
for( int i=(m_iNumVisible)/2; i>= 0; i-- ) // draw outside to inside
|
||||
{
|
||||
int iIndexToDraw1 = m_iSelection - i;
|
||||
int iIndexToDraw2 = m_iSelection + i;
|
||||
|
||||
// wrap IndexToDraw*
|
||||
iIndexToDraw1 = (iIndexToDraw1 + m_apSprites.size()*300) % m_apSprites.size(); // make sure this is positive
|
||||
iIndexToDraw2 = iIndexToDraw2 % m_apSprites.size();
|
||||
|
||||
ASSERT( iIndexToDraw1 >= 0 );
|
||||
|
||||
m_apSprites[iIndexToDraw1]->SetX( (-i+m_fSelectionLag) * m_iSpacing );
|
||||
m_apSprites[iIndexToDraw2]->SetX( (+i+m_fSelectionLag) * m_iSpacing );
|
||||
|
||||
if( i==0 ) // so we don't draw 0 twice
|
||||
if(m_iSpriteType == SPRITE_TYPE_SPRITE)
|
||||
{
|
||||
m_apSprites[iIndexToDraw1]->SetDiffuse( COLOR_SELECTED );
|
||||
m_apSprites[iIndexToDraw1]->Draw();
|
||||
// wrap IndexToDraw*
|
||||
iIndexToDraw1 = (iIndexToDraw1 + m_apSprites.size()*300) % m_apSprites.size(); // make sure this is positive
|
||||
iIndexToDraw2 = iIndexToDraw2 % m_apSprites.size();
|
||||
|
||||
ASSERT( iIndexToDraw1 >= 0 );
|
||||
|
||||
m_apSprites[iIndexToDraw1]->SetX( (-i+m_fSelectionLag) * m_iSpacing );
|
||||
m_apSprites[iIndexToDraw2]->SetX( (+i+m_fSelectionLag) * m_iSpacing );
|
||||
|
||||
if( i==0 ) // so we don't draw 0 twice
|
||||
{
|
||||
m_apSprites[iIndexToDraw1]->SetDiffuse( COLOR_SELECTED );
|
||||
m_apSprites[iIndexToDraw1]->Draw();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_apSprites[iIndexToDraw1]->SetDiffuse( COLOR_NOT_SELECTED );
|
||||
m_apSprites[iIndexToDraw2]->SetDiffuse( COLOR_NOT_SELECTED );
|
||||
m_apSprites[iIndexToDraw1]->Draw();
|
||||
m_apSprites[iIndexToDraw2]->Draw();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_apSprites[iIndexToDraw1]->SetDiffuse( COLOR_NOT_SELECTED );
|
||||
m_apSprites[iIndexToDraw2]->SetDiffuse( COLOR_NOT_SELECTED );
|
||||
m_apSprites[iIndexToDraw1]->Draw();
|
||||
m_apSprites[iIndexToDraw2]->Draw();
|
||||
// wrap IndexToDraw*
|
||||
iIndexToDraw1 = (iIndexToDraw1 + m_apCSprites.size()*300) % m_apCSprites.size(); // make sure this is positive
|
||||
iIndexToDraw2 = iIndexToDraw2 % m_apCSprites.size();
|
||||
|
||||
ASSERT( iIndexToDraw1 >= 0 );
|
||||
|
||||
m_apCSprites[iIndexToDraw1]->SetX( (-i+m_fSelectionLag) * m_iSpacing );
|
||||
m_apCSprites[iIndexToDraw2]->SetX( (+i+m_fSelectionLag) * m_iSpacing );
|
||||
|
||||
if( i==0 ) // so we don't draw 0 twice
|
||||
{
|
||||
m_apCSprites[iIndexToDraw1]->SetDiffuse( COLOR_SELECTED );
|
||||
m_apCSprites[iIndexToDraw1]->Draw();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_apCSprites[iIndexToDraw1]->SetDiffuse( COLOR_NOT_SELECTED );
|
||||
m_apCSprites[iIndexToDraw2]->SetDiffuse( COLOR_NOT_SELECTED );
|
||||
m_apCSprites[iIndexToDraw1]->Draw();
|
||||
m_apCSprites[iIndexToDraw2]->Draw();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user