From e8db36824a240410aab2c7eef0faeec61ae650fe Mon Sep 17 00:00:00 2001 From: Andrew Livy Date: Tue, 10 Dec 2002 23:16:44 +0000 Subject: [PATCH] Some Changes to ScrollingList to support different display modes on the music select screen. --- stepmania/TODO.andy | 7 +- stepmania/src/MusicBannerWheel.cpp | 99 ++++++++++-- stepmania/src/MusicBannerWheel.h | 8 + stepmania/src/ScreenEz2SelectMusic.cpp | 16 +- stepmania/src/ScreenEz2SelectMusic.h | 3 +- stepmania/src/ScrollingList.cpp | 203 ++++++++++++++++++++----- stepmania/src/ScrollingList.h | 8 +- 7 files changed, 286 insertions(+), 58 deletions(-) diff --git a/stepmania/TODO.andy b/stepmania/TODO.andy index a2b19b7be2..a851a52155 100644 --- a/stepmania/TODO.andy +++ b/stepmania/TODO.andy @@ -3,8 +3,11 @@ X denotes task complete or no longer required to do. - denotes task to do, but also being worked upon by other dev. H denotes task on hold. +TODO As of: 06:36:PM 10/12/02 +* Optimize The Music Banner Wheel + TODO As of: 04:46:PM 27/11/02 -* Systems Programming Assignment +X Systems Programming Assignment * Integrating Assignment 2 * Add Scoreboard Initials Entry Frontend @@ -18,7 +21,7 @@ TODO As of: 07:30:PM 28/10/02 X Networking Assignment X Integrating Assignment 1 -* Update Menu Graphics for Para +- Update Menu Graphics for Para H Update Menu Graphics for Ez2 H Finish The PUMP Graphics * Work on Beatmania Support diff --git a/stepmania/src/MusicBannerWheel.cpp b/stepmania/src/MusicBannerWheel.cpp index 07ae4105fe..240cbeefbc 100644 --- a/stepmania/src/MusicBannerWheel.cpp +++ b/stepmania/src/MusicBannerWheel.cpp @@ -18,46 +18,90 @@ #include "ThemeManager.h" #include "RageMusic.h" -#define MAXBANNERS 5 #define BANNERSPACING 200 - +#define MAXSONGSINBUFFER 5 +#define BANNERTYPE 1 MusicBannerWheel::MusicBannerWheel() { currentPos=0; + scrlistPos=0; + m_ScrollingList.UseSpriteType(BANNERTYPE); m_ScrollingList.SetXY( 0, 0 ); m_ScrollingList.SetSpacing( BANNERSPACING ); this->AddChild( &m_ScrollingList ); + + arraySongs = SONGMAN->m_pSongs; - SetNewPos(currentPos); - PlayMusicSample(); + LoadSongData(); + + m_debugtext.LoadFromFont( THEME->GetPathTo("Fonts","small titles") ); + m_debugtext.SetXY( 0, -120 ); + this->AddChild(&m_debugtext); } -void MusicBannerWheel::SetNewPos(int NewPos) +/************ TODO: OPTIMIZE THIS: MUST!!!! ********************/ +void MusicBannerWheel::LoadSongData() { - CArray arraySongs = SONGMAN->m_pSongs; Song* pSong; - - // TODO: OPTIMIZE THIS. (SO IT LOADS THE ENTIRE SONG LIST) CStringArray asGraphicPaths; - for( unsigned j=0; j= 0) + pSong = arraySongs[currentPos-2]; + else + pSong = arraySongs[arraySongs.size()-2]; + } + else if(count == scrlistPos+1 || (scrlistPos == MAXSONGSINBUFFER-1 && count == 0)) + { + if(currentPos+1 <= arraySongs.size()-1) + pSong = arraySongs[currentPos+1]; + else + pSong = arraySongs[0]; + } + /* if it's the previous element OR if we're at element 0..the 5th element (which will wrap to before element 0) + will actually appear as 5 songs along and not the one immediately before it,, so pull a sneaky and make the + final element actually be the song before... */ + else if(count == scrlistPos-1 || (scrlistPos == 0 && count == MAXSONGSINBUFFER-1)) + { + if(currentPos-1 >= 0) + pSong = arraySongs[currentPos-1]; + else + pSong = arraySongs[arraySongs.size()-1]; + } if( pSong == NULL ) asGraphicPaths.push_back(THEME->GetPathTo("Graphics","fallback banner")); else if (pSong->HasBanner()) asGraphicPaths.push_back(pSong->GetBannerPath()); else if (PREFSMAN->m_bUseBGIfNoBanner && pSong->HasBackground() ) asGraphicPaths.push_back(pSong->GetBannerPath()); else asGraphicPaths.push_back(THEME->GetPathTo("Graphics","fallback banner")); - } + } m_ScrollingList.Load( asGraphicPaths ); + PlayMusicSample(); } + Song* MusicBannerWheel::GetSelectedSong() { - CArray arraySongs = SONGMAN->m_pSongs; Song* pSong; - pSong=arraySongs[m_ScrollingList.GetSelection()]; + pSong=arraySongs[currentPos]; return(pSong); } @@ -74,14 +118,39 @@ void MusicBannerWheel::PlayMusicSample() void MusicBannerWheel::BannersLeft() { + if(currentPos==0) + currentPos=arraySongs.size()-1; + else + currentPos--; + + + if(scrlistPos==0) + scrlistPos = MAXSONGSINBUFFER-1; + else + scrlistPos--; + + m_ScrollingList.Unload(); + LoadSongData(); + m_debugtext.SetText(ssprintf("currentPos: %d scrlistPos: %d",currentPos,scrlistPos)); m_ScrollingList.Left(); - PlayMusicSample(); } void MusicBannerWheel::BannersRight() { + if(currentPos>=arraySongs.size()-1) + currentPos=0; + else + currentPos++; + + if(scrlistPos==MAXSONGSINBUFFER-1) + scrlistPos=0; + else + scrlistPos++; + + m_ScrollingList.Unload(); + LoadSongData(); + m_debugtext.SetText(ssprintf("currentPos: %d scrlistPos: %d",currentPos,scrlistPos)); m_ScrollingList.Right(); - PlayMusicSample(); } MusicBannerWheel::~MusicBannerWheel() diff --git a/stepmania/src/MusicBannerWheel.h b/stepmania/src/MusicBannerWheel.h index 0d6f154a23..b9f41525fa 100644 --- a/stepmania/src/MusicBannerWheel.h +++ b/stepmania/src/MusicBannerWheel.h @@ -15,6 +15,8 @@ #include "Banner.h" #include "Sprite.h" #include "ScrollingList.h" +#include "SongManager.h" +#include "BitmapText.h" class MusicBannerWheel : public ActorFrame { @@ -27,9 +29,15 @@ public: private: void SetNewPos(int NewPos); void PlayMusicSample(); + void LoadSongData(); + + BitmapText m_debugtext; ScrollingList m_ScrollingList; int currentPos; + int scrlistPos; + + CArray arraySongs; }; #endif diff --git a/stepmania/src/ScreenEz2SelectMusic.cpp b/stepmania/src/ScreenEz2SelectMusic.cpp index 348d8350bc..661b210cc0 100644 --- a/stepmania/src/ScreenEz2SelectMusic.cpp +++ b/stepmania/src/ScreenEz2SelectMusic.cpp @@ -28,13 +28,23 @@ #include "PrefsManager.h" #include "ThemeManager.h" +#define HELP_TEXT THEME->GetMetric("ScreenSelectMusic","HelpText") +#define TIMER_SECONDS THEME->GetMetricI("ScreenSelectMusic","TimerSeconds") ScreenEz2SelectMusic::ScreenEz2SelectMusic() { - MUSIC->Stop(); + m_Menu.Load( + THEME->GetPathTo("BGAnimations","select music"), + THEME->GetPathTo("Graphics","select music top edge"), + HELP_TEXT, true, true, TIMER_SECONDS + ); + this->AddChild( &m_Menu ); + m_MusicBannerWheel.SetX(CENTER_X); m_MusicBannerWheel.SetY(CENTER_Y); this->AddChild( &m_MusicBannerWheel ); + + m_Menu.TweenOnScreenFromMenu( SM_None ); } void ScreenEz2SelectMusic::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ) @@ -83,9 +93,9 @@ void ScreenEz2SelectMusic::Update( float fDeltaTime ) void ScreenEz2SelectMusic::DrawPrimitives() { -// m_Menu.DrawBottomLayer(); + m_Menu.DrawBottomLayer(); Screen::DrawPrimitives(); -// m_Menu.DrawTopLayer(); + m_Menu.DrawTopLayer(); } diff --git a/stepmania/src/ScreenEz2SelectMusic.h b/stepmania/src/ScreenEz2SelectMusic.h index c95b2847f0..cbdb049f0c 100644 --- a/stepmania/src/ScreenEz2SelectMusic.h +++ b/stepmania/src/ScreenEz2SelectMusic.h @@ -19,7 +19,7 @@ #include "TipDisplay.h" #include "RageSoundStream.h" #include "MusicBannerWheel.h" - +#include "MenuElements.h" class ScreenEz2SelectMusic : public Screen { @@ -32,6 +32,7 @@ public: virtual void HandleScreenMessage( const ScreenMessage SM ); protected: MusicBannerWheel m_MusicBannerWheel; + MenuElements m_Menu; }; diff --git a/stepmania/src/ScrollingList.cpp b/stepmania/src/ScrollingList.cpp index ddbd5ceae7..554b44c37f 100644 --- a/stepmania/src/ScrollingList.cpp +++ b/stepmania/src/ScrollingList.cpp @@ -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; iLoad( asGraphicPaths[i] ); - m_apSprites.push_back( pNewSprite ); + for( unsigned i=0; iLoad( asGraphicPaths[i] ); + m_apSprites.push_back( pNewSprite ); + } + } + else + { + for( unsigned i=0; iSetCroppedSize( 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; iUpdate( fDeltaTime ); + if(m_iSpriteType == SPRITE_TYPE_SPRITE) + { + for( unsigned i=0; iUpdate( fDeltaTime ); + } + else + { + for( unsigned i=0; iUpdate( 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(); + } } } } diff --git a/stepmania/src/ScrollingList.h b/stepmania/src/ScrollingList.h index c97e3d0032..22d7c66a5f 100644 --- a/stepmania/src/ScrollingList.h +++ b/stepmania/src/ScrollingList.h @@ -13,6 +13,7 @@ #include "ActorFrame.h" #include "Sprite.h" +#include "CroppedSprite.h" class ScrollingList : public ActorFrame @@ -31,17 +32,20 @@ public: int GetSelection(); void SetNumberVisible( int iNumVisibleElements ); void SetSpacing( int iSpacingInPixels ); - + void UseSpriteType(int NewSpriteType); void Left(); void Right(); protected: - + + int m_iBannerPrefs; + int m_iSpriteType; int m_iSelection; float m_fSelectionLag; int m_iSpacing; int m_iNumVisible; CArray m_apSprites; // stores the list of elements (left to right) + CArray m_apCSprites; // stores the list of elements (left to right) }; #endif