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 getName();
string getAvatarFilename();
int getAvatarId(int deckId);
string getStatsSummary();
int getDeckId();

View File

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

View File

@@ -21,11 +21,13 @@ protected:
vector<string> strings;
unsigned int currentId;
int mRandom;
int scrollDirection;
public:
void Add(string text);
void Reset();
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 Update(float dt);
virtual ostream& toString(ostream& out) const;

View File

@@ -34,7 +34,9 @@ void DeckMetaData::loadStatsForPlayer( Player * statsPlayer, string deckStatsFil
_victories = opponentDeckStats->victories;
_nbGamesPlayed = opponentDeckStats->nbgames;
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();
if (_percentVictories < 34)
{
@@ -52,7 +54,7 @@ void DeckMetaData::loadStatsForPlayer( Player * statsPlayer, string deckStatsFil
else
{
ostringstream oss;
oss << "avatar" << this->getDeckId() << ".jpg";
oss << "avatar" << getAvatarId( _deckid ) << ".jpg";
_avatarFilename = oss.str();
}
}
@@ -66,6 +68,16 @@ void DeckMetaData::loadStatsForPlayer( Player * statsPlayer, string deckStatsFil
}
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){
MTGDeck * mtgd = NEW MTGDeck(filename.c_str(),NULL,1);

View File

@@ -15,6 +15,7 @@
#include "Credits.h"
#include "Translate.h"
#include "Rules.h"
#include "TextScroller.h"
#ifdef TESTSUITE
#include "TestSuiteAI.h"
@@ -64,10 +65,14 @@ GameStateDuel::GameStateDuel(GameApp* parent): GameState(parent) {
credits = NULL;
rules = NULL;
initScroller();
}
GameStateDuel::~GameStateDuel() {
End();
SAFE_DELETE(scroller);
}
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)
{
switch (mGamePhase)
@@ -301,15 +321,15 @@ void GameStateDuel::Update(float dt)
break;
case DUEL_STATE_CHOOSE_DECK2:
if (mParent->players[1] == PLAYER_TYPE_HUMAN)
deckmenu->Update(dt);
deckmenu->Update(dt);
else{
if (mParent->players[0] == PLAYER_TYPE_HUMAN){
ensureOpponentMenu();
opponentMenu->Update(dt);
}else{
loadPlayer(1);
mGamePhase = DUEL_STATE_PLAY;
}
if (mParent->players[0] == PLAYER_TYPE_HUMAN){
ensureOpponentMenu();
opponentMenu->Update(dt);
}else{
loadPlayer(1);
mGamePhase = DUEL_STATE_PLAY;
}
}
break;
case DUEL_STATE_CHOOSE_DECK2_TO_PLAY:
@@ -413,6 +433,7 @@ void GameStateDuel::Update(float dt)
PlayerData * playerdata = NEW PlayerData(mParent->collection);
playerdata->taskList->passOneDay();
playerdata->taskList->save();
initScroller();
SAFE_DELETE(playerdata);
SAFE_DELETE(menu);
}
@@ -424,6 +445,9 @@ void GameStateDuel::Update(float dt)
if (JGE_BTN_OK == mEngine->ReadButton())
mParent->SetNextState(GAME_STATE_MENU);
}
// Update the scroller
scroller->Update(dt);
}
@@ -435,6 +459,7 @@ void GameStateDuel::Render()
if (game)
game->Render();
switch (mGamePhase)
{
case DUEL_STATE_END:
@@ -485,6 +510,8 @@ void GameStateDuel::Render()
opponentMenu->Render();
else if (deckmenu)
deckmenu->Render();
scroller->Render();
}
break;
case DUEL_STATE_ERROR_NO_DECK:

View File

@@ -5,7 +5,13 @@
#include "utils.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;
mSpeed = speed;
mX = x;
@@ -14,6 +20,7 @@ TextScroller::TextScroller(int fontId, float x, float y, float width, float spee
timer = 0;
currentId = 0;
mRandom = 0;
scrollDirection = scrollerType;
}
void TextScroller::setRandom(int mode){
@@ -36,24 +43,46 @@ void TextScroller::Reset(){
void TextScroller::Update(float dt){
if(!strings.size())
return;
start+=mSpeed*dt;
WFont * mFont = resources.GetWFont(fontId);
if (start > mFont->GetStringWidth(mText.c_str())){
start = -mWidth;
if (mRandom){
currentId = (rand() % strings.size());
}else{
currentId++;
if (currentId > strings.size()-1)currentId = 0;
if ( scrollDirection == HORIZONTAL_SCROLLER )
{
start+=mSpeed*dt;
WFont * mFont = resources.GetWFont(fontId);
if (start > mFont->GetStringWidth(mText.c_str())){
start = -mWidth;
if (mRandom){
currentId = (rand() % strings.size());
}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(){
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