fixed avatar image issue when selecting ai decks outside of the default 100 ai decks.

installed a horizontal text scroller for the deck selection screens in normal play
TODO:-> Need to make it smoother transition.  It currently just replaces the text with the new text.
This commit is contained in:
techdragon.nguyen@gmail.com
2010-11-02 02:20:44 +00:00
parent afe52d883a
commit f472c48a8a
6 changed files with 99 additions and 25 deletions

View File

@@ -39,6 +39,7 @@ public:
string getDescription(); string getDescription();
string getName(); string getName();
string getAvatarFilename(); string getAvatarFilename();
int getAvatarId(int deckId);
string getStatsSummary(); string getStatsSummary();
int getDeckId(); int getDeckId();

View File

@@ -7,6 +7,7 @@
#include "DeckMenu.h" #include "DeckMenu.h"
#include "MTGDeck.h" #include "MTGDeck.h"
#include "GameObserver.h" #include "GameObserver.h"
#include "TextScroller.h"
#define CHOOSE_OPPONENT 7 #define CHOOSE_OPPONENT 7
@@ -32,6 +33,7 @@ class GameStateDuel: public GameState, public JGuiListener
DeckMenu * deckmenu; DeckMenu * deckmenu;
DeckMenu * opponentMenu; DeckMenu * opponentMenu;
SimpleMenu * menu; SimpleMenu * menu;
TextScroller * scroller;
bool premadeDeck; bool premadeDeck;
int OpponentsDeckid; int OpponentsDeckid;
string musictrack; string musictrack;
@@ -40,7 +42,8 @@ class GameStateDuel: public GameState, public JGuiListener
bool MusicExist(string FileName); bool MusicExist(string FileName);
void loadPlayer(int playerId, int decknb = 0, int isAI = 0); void loadPlayer(int playerId, int decknb = 0, int isAI = 0);
void ensureOpponentMenu(); //loads the opponentMenu if it doesn't exist void ensureOpponentMenu(); //loads the opponentMenu if it doesn't exist
void initScroller();
public: public:
GameStateDuel(GameApp* parent); GameStateDuel(GameApp* parent);
virtual ~GameStateDuel(); virtual ~GameStateDuel();

View File

@@ -21,11 +21,13 @@ protected:
vector<string> strings; vector<string> strings;
unsigned int currentId; unsigned int currentId;
int mRandom; int mRandom;
int scrollDirection;
public: public:
void Add(string text); void Add(string text);
void Reset(); void Reset();
void setRandom(int mode = 1); void setRandom(int mode = 1);
TextScroller(int fontId, float x, float y, float width, float speed = 30); TextScroller(int fontId, float x, float y, float width, float speed = 30, int scrollerType = 0);
void Render(); void Render();
void Update(float dt); void Update(float dt);
virtual ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;

View File

@@ -34,7 +34,9 @@ void DeckMetaData::loadStatsForPlayer( Player * statsPlayer, string deckStatsFil
_victories = opponentDeckStats->victories; _victories = opponentDeckStats->victories;
_nbGamesPlayed = opponentDeckStats->nbgames; _nbGamesPlayed = opponentDeckStats->nbgames;
ostringstream oss; ostringstream oss;
oss << "avatar" << deckStatsFileName.substr( deckStatsFileName.find("deck") + 4, deckStatsFileName.find_last_of(".") -1 ) << ".jpg"; int oppDeckId = atoi ( deckStatsFileName.substr( deckStatsFileName.find("deck") + 4, deckStatsFileName.find_last_of(".") ).c_str() );
int avatarId = getAvatarId( oppDeckId );
oss << "avatar" << avatarId << ".jpg";
_avatarFilename = oss.str(); _avatarFilename = oss.str();
if (_percentVictories < 34) if (_percentVictories < 34)
{ {
@@ -52,7 +54,7 @@ void DeckMetaData::loadStatsForPlayer( Player * statsPlayer, string deckStatsFil
else else
{ {
ostringstream oss; ostringstream oss;
oss << "avatar" << this->getDeckId() << ".jpg"; oss << "avatar" << getAvatarId( _deckid ) << ".jpg";
_avatarFilename = oss.str(); _avatarFilename = oss.str();
} }
} }
@@ -66,6 +68,16 @@ void DeckMetaData::loadStatsForPlayer( Player * statsPlayer, string deckStatsFil
} }
stats = NULL; stats = NULL;
} }
// since we only have 100 stock avatar images, we need to recylce the images for deck numbers > 99
int DeckMetaData::getAvatarId( int deckId )
{
int avatarId = deckId % 100;
if ( deckId >= 100 && avatarId == 0)
return 100;
return avatarId;
}
void DeckMetaData::load(string filename){ void DeckMetaData::load(string filename){
MTGDeck * mtgd = NEW MTGDeck(filename.c_str(),NULL,1); MTGDeck * mtgd = NEW MTGDeck(filename.c_str(),NULL,1);

View File

@@ -15,6 +15,7 @@
#include "Credits.h" #include "Credits.h"
#include "Translate.h" #include "Translate.h"
#include "Rules.h" #include "Rules.h"
#include "TextScroller.h"
#ifdef TESTSUITE #ifdef TESTSUITE
#include "TestSuiteAI.h" #include "TestSuiteAI.h"
@@ -64,10 +65,14 @@ GameStateDuel::GameStateDuel(GameApp* parent): GameState(parent) {
credits = NULL; credits = NULL;
rules = NULL; rules = NULL;
initScroller();
} }
GameStateDuel::~GameStateDuel() { GameStateDuel::~GameStateDuel() {
End(); End();
SAFE_DELETE(scroller);
} }
void GameStateDuel::Start() void GameStateDuel::Start()
@@ -249,6 +254,21 @@ void GameStateDuel::ensureOpponentMenu(){
} }
} }
void GameStateDuel::initScroller()
{
scroller = NEW TextScroller(Fonts::MAIN_FONT, 40 , 230, 400, 100, 1);
// add all the items from the Tasks db.
TaskList *taskList = NEW TaskList();
scroller->Reset();
for (vector<Task*>::iterator it = taskList->tasks.begin(); it!=taskList->tasks.end(); it++)
{
ostringstream taskDescription;
taskDescription << (*it)->getDesc() <<endl;
scroller->Add( taskDescription.str() );
}
SAFE_DELETE(taskList);
}
void GameStateDuel::Update(float dt) void GameStateDuel::Update(float dt)
{ {
switch (mGamePhase) switch (mGamePhase)
@@ -301,15 +321,15 @@ void GameStateDuel::Update(float dt)
break; break;
case DUEL_STATE_CHOOSE_DECK2: case DUEL_STATE_CHOOSE_DECK2:
if (mParent->players[1] == PLAYER_TYPE_HUMAN) if (mParent->players[1] == PLAYER_TYPE_HUMAN)
deckmenu->Update(dt); deckmenu->Update(dt);
else{ else{
if (mParent->players[0] == PLAYER_TYPE_HUMAN){ if (mParent->players[0] == PLAYER_TYPE_HUMAN){
ensureOpponentMenu(); ensureOpponentMenu();
opponentMenu->Update(dt); opponentMenu->Update(dt);
}else{ }else{
loadPlayer(1); loadPlayer(1);
mGamePhase = DUEL_STATE_PLAY; mGamePhase = DUEL_STATE_PLAY;
} }
} }
break; break;
case DUEL_STATE_CHOOSE_DECK2_TO_PLAY: case DUEL_STATE_CHOOSE_DECK2_TO_PLAY:
@@ -413,6 +433,7 @@ void GameStateDuel::Update(float dt)
PlayerData * playerdata = NEW PlayerData(mParent->collection); PlayerData * playerdata = NEW PlayerData(mParent->collection);
playerdata->taskList->passOneDay(); playerdata->taskList->passOneDay();
playerdata->taskList->save(); playerdata->taskList->save();
initScroller();
SAFE_DELETE(playerdata); SAFE_DELETE(playerdata);
SAFE_DELETE(menu); SAFE_DELETE(menu);
} }
@@ -424,6 +445,9 @@ void GameStateDuel::Update(float dt)
if (JGE_BTN_OK == mEngine->ReadButton()) if (JGE_BTN_OK == mEngine->ReadButton())
mParent->SetNextState(GAME_STATE_MENU); mParent->SetNextState(GAME_STATE_MENU);
} }
// Update the scroller
scroller->Update(dt);
} }
@@ -435,6 +459,7 @@ void GameStateDuel::Render()
if (game) if (game)
game->Render(); game->Render();
switch (mGamePhase) switch (mGamePhase)
{ {
case DUEL_STATE_END: case DUEL_STATE_END:
@@ -485,6 +510,8 @@ void GameStateDuel::Render()
opponentMenu->Render(); opponentMenu->Render();
else if (deckmenu) else if (deckmenu)
deckmenu->Render(); deckmenu->Render();
scroller->Render();
} }
break; break;
case DUEL_STATE_ERROR_NO_DECK: case DUEL_STATE_ERROR_NO_DECK:

View File

@@ -5,7 +5,13 @@
#include "utils.h" #include "utils.h"
#include "WFont.h" #include "WFont.h"
TextScroller::TextScroller(int fontId, float x, float y, float width, float speed):JGuiObject(0),fontId(fontId){ enum {
HORIZONTAL_SCROLLER = 0,
VERTICAL_SCROLLER = 1
};
TextScroller::TextScroller(int fontId, float x, float y, float width, float speed, int scrollerType ): JGuiObject(0), fontId(fontId){
mWidth = width; mWidth = width;
mSpeed = speed; mSpeed = speed;
mX = x; mX = x;
@@ -14,6 +20,7 @@ TextScroller::TextScroller(int fontId, float x, float y, float width, float spee
timer = 0; timer = 0;
currentId = 0; currentId = 0;
mRandom = 0; mRandom = 0;
scrollDirection = scrollerType;
} }
void TextScroller::setRandom(int mode){ void TextScroller::setRandom(int mode){
@@ -36,24 +43,46 @@ void TextScroller::Reset(){
void TextScroller::Update(float dt){ void TextScroller::Update(float dt){
if(!strings.size()) if(!strings.size())
return; return;
start+=mSpeed*dt; if ( scrollDirection == HORIZONTAL_SCROLLER )
WFont * mFont = resources.GetWFont(fontId); {
if (start > mFont->GetStringWidth(mText.c_str())){ start+=mSpeed*dt;
start = -mWidth; WFont * mFont = resources.GetWFont(fontId);
if (mRandom){ if (start > mFont->GetStringWidth(mText.c_str())){
currentId = (rand() % strings.size()); start = -mWidth;
}else{ if (mRandom){
currentId++; currentId = (rand() % strings.size());
if (currentId > strings.size()-1)currentId = 0; }else{
currentId++;
if (currentId > strings.size()-1)currentId = 0;
}
mText = strings[currentId];
} }
mText = strings[currentId];
} }
else
{
// we want to display 3 at a time
ostringstream scrollerText;
if ( timer == 0 )
{
for ( int idx = 0; idx < 2; idx ++ )
{
scrollerText << strings[currentId + idx];
}
currentId++;
if ( currentId >= (strings.size()-1) )
currentId = 0;
mText = scrollerText.str();
}
timer = ++timer % ((int) mSpeed);
}
} }
void TextScroller::Render(){ void TextScroller::Render(){
WFont * mFont = resources.GetWFont(fontId); WFont * mFont = resources.GetWFont(fontId);
mFont->DrawString(mText.c_str(),mX,mY,JGETEXT_LEFT,start,mWidth); if ( scrollDirection == HORIZONTAL_SCROLLER )
mFont->DrawString(mText.c_str(),mX,mY,JGETEXT_LEFT,start,mWidth);
else
mFont->DrawString(mText.c_str(), mX, mY );
} }
ostream& TextScroller::toString(ostream& out) const ostream& TextScroller::toString(ostream& out) const