Support for an arbitrary number of karts added to character selection
menu. git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@2137 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
2eddb848df
commit
8c6378df34
@ -38,10 +38,15 @@
|
||||
enum WidgetTokens
|
||||
{
|
||||
WTOK_TITLE,
|
||||
WTOK_NAME,
|
||||
|
||||
WTOK_QUIT,
|
||||
WTOK_RACER0
|
||||
WTOK_EMPTY_UP,
|
||||
WTOK_UP,
|
||||
WTOK_EMPTY_DOWN,
|
||||
WTOK_DOWN,
|
||||
WTOK_EMPTY0 = 10,
|
||||
WTOK_NAME0 = 20,
|
||||
WTOK_RACER0 = 30
|
||||
};
|
||||
|
||||
CharSel::CharSel(int whichPlayer)
|
||||
@ -62,7 +67,7 @@ CharSel::CharSel(int whichPlayer)
|
||||
kart_properties_manager->m_selected_karts.clear();
|
||||
|
||||
if (m_player_index < (int)kart_properties_manager->m_selected_karts.size())
|
||||
kart_properties_manager->m_selected_karts.pop_back();
|
||||
kart_properties_manager->m_selected_karts.pop_back();
|
||||
|
||||
char heading[MAX_MESSAGE_LENGTH];
|
||||
snprintf(heading, sizeof(heading), _("Player %d, choose a driver"),
|
||||
@ -73,26 +78,50 @@ CharSel::CharSel(int whichPlayer)
|
||||
widget_manager->addEmptyWgt( WidgetManager::WGT_NONE, 1, 2);
|
||||
widget_manager->breakLine();
|
||||
|
||||
for (unsigned int i = 0; i < kart_properties_manager->getNumberOfKarts(); i++)
|
||||
m_num_entries = 0;
|
||||
for(unsigned int i=0; i<kart_properties_manager->getNumberOfKarts(); i++)
|
||||
{
|
||||
// Check if i has been previously selected
|
||||
if (kartAvailable(i))
|
||||
if(kartAvailable(i))
|
||||
{
|
||||
const KartProperties* kp= kart_properties_manager->getKartById(i);
|
||||
if(unlock_manager->isLocked(kp->getIdent())) continue;
|
||||
|
||||
widget_manager->addImgButtonWgt( WTOK_RACER0 + i, 8, 11,
|
||||
kp->getIconFile() );
|
||||
m_indexAvailKart.push_back(i);
|
||||
m_num_entries++;
|
||||
}
|
||||
}
|
||||
if(m_num_entries>7) m_num_entries = 7;
|
||||
|
||||
const int HEIGHT = 10;
|
||||
widget_manager->addEmptyWgt(WTOK_EMPTY_UP, computeIndent(0), HEIGHT/2);
|
||||
widget_manager->addTextButtonWgt(WTOK_UP, 20, HEIGHT/2, "^");
|
||||
widget_manager->breakLine();
|
||||
|
||||
|
||||
int indx;
|
||||
const KartProperties* kp;
|
||||
|
||||
for (unsigned int i = 0; i < m_num_entries; i++)
|
||||
{
|
||||
indx = m_indexAvailKart[i];
|
||||
kp = kart_properties_manager->getKartById(indx);
|
||||
widget_manager->addEmptyWgt( WTOK_EMPTY0+i, computeIndent(i), HEIGHT );
|
||||
widget_manager->addImgButtonWgt(WTOK_RACER0 + i, 8, HEIGHT,
|
||||
kp->getIconFile() );
|
||||
widget_manager->addTextButtonWgt(WTOK_NAME0+i, 30, HEIGHT, kp->getName());
|
||||
widget_manager->setWgtTextSize(WTOK_NAME0+i, WGT_FNT_SML);
|
||||
widget_manager->breakLine();
|
||||
}
|
||||
|
||||
m_offset = 0;
|
||||
updateScrollPosition();
|
||||
|
||||
widget_manager->addEmptyWgt(WTOK_EMPTY_DOWN, computeIndent(m_num_entries), HEIGHT/2);
|
||||
widget_manager->addTextButtonWgt(WTOK_DOWN, 20, HEIGHT/2, "v");
|
||||
widget_manager->breakLine();
|
||||
|
||||
widget_manager->breakLine();
|
||||
widget_manager->addEmptyWgt( WidgetManager::WGT_NONE, 1, 2);
|
||||
widget_manager->breakLine();
|
||||
|
||||
widget_manager->addTextWgt( WTOK_NAME, 30, 7, "");
|
||||
|
||||
widget_manager->layout(WGT_AREA_TOP);
|
||||
widget_manager->layout(WGT_AREA_RGT);
|
||||
|
||||
m_current_kart = -1;
|
||||
|
||||
@ -107,11 +136,11 @@ CharSel::CharSel(int whichPlayer)
|
||||
switchCharacter(0);
|
||||
}
|
||||
|
||||
|
||||
m_clock = 0;
|
||||
m_offset = 0;
|
||||
m_clock = 0;
|
||||
//test
|
||||
|
||||
}
|
||||
} // CharSel
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
CharSel::~CharSel()
|
||||
@ -120,16 +149,30 @@ CharSel::~CharSel()
|
||||
ssgDeRefDelete(m_kart);
|
||||
|
||||
delete m_context;
|
||||
}
|
||||
} // ~CharSel
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CharSel::updateScrollPosition()
|
||||
{
|
||||
for(unsigned int i=0; i<m_num_entries; i++)
|
||||
{
|
||||
int indx = (i+m_offset) % m_indexAvailKart.size();
|
||||
indx = m_indexAvailKart[indx];
|
||||
|
||||
const KartProperties* kp= kart_properties_manager->getKartById(indx);
|
||||
|
||||
if(unlock_manager->isLocked(kp->getIdent())) continue;
|
||||
widget_manager->setWgtText(WTOK_NAME0 + i, kp->getName());
|
||||
widget_manager->setWgtTexture(WTOK_RACER0 + i, kp->getIconFile() );
|
||||
} // for i
|
||||
} // updateScrollPosition<
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CharSel::switchCharacter(int n)
|
||||
{
|
||||
const KartProperties* kp= kart_properties_manager->getKartById(n);
|
||||
const KartProperties* kp= kart_properties_manager->getKartById(m_indexAvailKart[n]);
|
||||
if (m_current_kart != n && kp != NULL)
|
||||
{
|
||||
widget_manager->setWgtText( WTOK_NAME, kp->getName().c_str());
|
||||
|
||||
m_current_kart = n;
|
||||
ssgDeRefDelete(m_kart);
|
||||
m_kart = new ssgTransform;
|
||||
@ -138,7 +181,7 @@ void CharSel::switchCharacter(int n)
|
||||
|
||||
m_kart->addKid(kartentity);
|
||||
}
|
||||
}
|
||||
} // switchCharacter
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CharSel::update(float dt)
|
||||
@ -147,7 +190,10 @@ void CharSel::update(float dt)
|
||||
|
||||
if( widget_manager->selectionChanged() )
|
||||
{
|
||||
switchCharacter(widget_manager->getSelectedWgt() - WTOK_RACER0);
|
||||
int token = widget_manager->getSelectedWgt() - WTOK_RACER0;
|
||||
if(token<0 || token>(int)m_num_entries)
|
||||
token = widget_manager->getSelectedWgt() - WTOK_NAME0;
|
||||
switchCharacter((token+m_offset)%kart_properties_manager->getNumberOfKarts());
|
||||
}
|
||||
|
||||
if (m_kart != NULL)
|
||||
@ -161,7 +207,7 @@ void CharSel::update(float dt)
|
||||
// applying a big camera FOV.
|
||||
int w = user_config->m_width;
|
||||
int h = user_config->m_height;
|
||||
glViewport ( 0, 0, w, h);
|
||||
glViewport ( 0, h*1/4, (int)(0.7f*w), (int)(0.7f*h));
|
||||
|
||||
m_context -> setFOV ( 65.0f, 65.0f * h/w ) ;
|
||||
m_context -> setNearFar ( 0.05f, 1000.0f ) ;
|
||||
@ -183,20 +229,42 @@ void CharSel::update(float dt)
|
||||
}
|
||||
|
||||
widget_manager->update(dt);
|
||||
}
|
||||
} // update
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void CharSel::select()
|
||||
{
|
||||
const int TOKEN = widget_manager->getSelectedWgt() - WTOK_RACER0;
|
||||
const KartProperties* KP = kart_properties_manager->getKartById(TOKEN);
|
||||
int wgt = widget_manager->getSelectedWgt();
|
||||
if(wgt==WTOK_UP)
|
||||
{
|
||||
m_offset--;
|
||||
if(m_offset < 0) m_offset = m_indexAvailKart.size() - 1;
|
||||
updateScrollPosition();
|
||||
return;
|
||||
}
|
||||
if(wgt==WTOK_DOWN)
|
||||
{
|
||||
m_offset++;
|
||||
if( m_offset >= (int)m_indexAvailKart.size() ) m_offset=0;
|
||||
updateScrollPosition();
|
||||
return;
|
||||
}
|
||||
int token = widget_manager->getSelectedWgt() - WTOK_RACER0;
|
||||
if(token<0 || token>(int)m_num_entries)
|
||||
{
|
||||
token = widget_manager->getSelectedWgt() - WTOK_NAME0;
|
||||
}
|
||||
token = (token+m_offset) % m_indexAvailKart.size();
|
||||
int kart_id = m_indexAvailKart[token];
|
||||
const KartProperties* KP = kart_properties_manager->getKartById(kart_id);
|
||||
if (KP != NULL)
|
||||
{
|
||||
printf("selecting kart %s\n",KP->getIdent().c_str());
|
||||
race_manager->setPlayerKart(m_player_index, KP->getIdent());
|
||||
user_config->m_player[m_player_index].setLastKartId(TOKEN);
|
||||
// Add selected kart (TOKEN) to selected karts vector so it cannot be
|
||||
user_config->m_player[m_player_index].setLastKartId(kart_id);
|
||||
// Add selected kart (token) to selected karts vector so it cannot be
|
||||
// selected again
|
||||
kart_properties_manager->m_selected_karts.push_back(TOKEN);
|
||||
kart_properties_manager->m_selected_karts.push_back(kart_id);
|
||||
}
|
||||
|
||||
if (race_manager->getNumPlayers() > 1)
|
||||
@ -249,4 +317,4 @@ bool CharSel::kartAvailable(int kart)
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} // kartAvailable
|
||||
|
@ -20,6 +20,7 @@
|
||||
#ifndef HEADER_CHARSEL_H
|
||||
#define HEADER_CHARSEL_H
|
||||
|
||||
#include <vector>
|
||||
#include "base_gui.hpp"
|
||||
|
||||
class ssgTransform;
|
||||
@ -28,15 +29,18 @@ class ssgContext;
|
||||
class CharSel: public BaseGUI
|
||||
{
|
||||
private:
|
||||
ssgContext* m_context;
|
||||
ssgTransform* m_kart;
|
||||
int m_current_kart;
|
||||
float m_clock;
|
||||
|
||||
int m_player_index;
|
||||
ssgContext *m_context;
|
||||
ssgTransform *m_kart;
|
||||
int m_current_kart;
|
||||
float m_clock;
|
||||
int m_player_index;
|
||||
int m_offset; // index of first racer displayed
|
||||
unsigned int m_num_entries; // number of entries to display
|
||||
std::vector<int> m_indexAvailKart;
|
||||
|
||||
bool kartAvailable(int kart);
|
||||
|
||||
bool kartAvailable(int kart);
|
||||
void updateScrollPosition();
|
||||
int computeIndent(int n) {return 40+abs((m_num_entries-1)/2 - n)*3;}
|
||||
public:
|
||||
CharSel(int which_player);
|
||||
~CharSel();
|
||||
|
Loading…
x
Reference in New Issue
Block a user