Some organisational prep work before I start working on a new navigation method (ie replacement for CardSelector). The current design was to allocate a CardSelector and pass in its pointer to a variety of classes via their constructors. To simplify things, now we use a singleton style pattern with an Instance() function - this means that when I implement a new class to replace CardSelector, I only need to modify what's returned by the singleton callback - as long as the new pointer class supports the same function calls, it'll be a straight drop-in.

This commit is contained in:
wrenczes@gmail.com
2010-10-22 08:41:44 +00:00
parent 84004c7c7f
commit e2de03d987
13 changed files with 177 additions and 118 deletions
+26 -3
View File
@@ -29,7 +29,7 @@ struct LimitorFunctor
template <typename T=PlayGuiObject> template <typename T=PlayGuiObject>
class ObjectSelector : public GuiLayer class ObjectSelector : public GuiLayer
{ {
public: public:
typedef enum { typedef enum {
nullZone, handZone, playZone nullZone, handZone, playZone
} SelectorZone; } SelectorZone;
@@ -41,7 +41,7 @@ class ObjectSelector : public GuiLayer
SelectorMemory() { object = NULL; x = y = 0; }; SelectorMemory() { object = NULL; x = y = 0; };
}; };
protected: protected:
vector<T*> cards; vector<T*> cards;
T* active; T* active;
DuelLayers* duel; DuelLayers* duel;
@@ -53,7 +53,7 @@ class ObjectSelector : public GuiLayer
T* fetchMemory(SelectorMemory&); T* fetchMemory(SelectorMemory&);
public: public:
ObjectSelector(DuelLayers*); ObjectSelector(DuelLayers*);
int bigMode; int bigMode;
void Add(T*); void Add(T*);
@@ -75,6 +75,29 @@ class ObjectSelector : public GuiLayer
typedef ObjectSelector<> CardSelector; typedef ObjectSelector<> CardSelector;
typedef LimitorFunctor<CardSelector::Target> Limitor; typedef LimitorFunctor<CardSelector::Target> Limitor;
namespace CardSelectorSingleton
{
/*
** CardSelector is essentially a singleton in its usage
** It's not enforced, but it needs to eventually migrate to the real thing
** For now, this function will fake it out - it's up to the client caller to make sure
** that this gets destroyed via a Terminate call (this is currently handled in DualLayers's destructor)
*/
CardSelector* Instance();
/*
** Create the singleton pointer. Instance() isn't valid until this is called.
*/
CardSelector* Create(DuelLayers* inDuelLayers);
/*
** Teardown the singleton pointer instance.
*/
void Terminate();
}
struct Exp struct Exp
{ {
static inline bool test(CardSelector::Target*, CardSelector::Target*); static inline bool test(CardSelector::Target*, CardSelector::Target*);
+1 -1
View File
@@ -43,7 +43,7 @@ public:
int receiveEvent(WEvent * e); int receiveEvent(WEvent * e);
float RightBoundary(); float RightBoundary();
CardSelector* cs; CardSelector* mCardSelector;
}; };
#include "ActionLayer.h" #include "ActionLayer.h"
+1 -2
View File
@@ -15,12 +15,11 @@ class GuiAvatars : public GuiLayer
GuiGraveyard* selfGraveyard, *opponentGraveyard; GuiGraveyard* selfGraveyard, *opponentGraveyard;
GuiLibrary* selfLibrary, *opponentLibrary; GuiLibrary* selfLibrary, *opponentLibrary;
GuiOpponentHand *opponentHand; GuiOpponentHand *opponentHand;
CardSelector* cs;
GuiAvatar* active; GuiAvatar* active;
public: public:
GuiAvatars(CardSelector*); GuiAvatars();
~GuiAvatars(); ~GuiAvatars();
GuiAvatar* GetSelf(); GuiAvatar* GetSelf();
+3 -4
View File
@@ -35,10 +35,9 @@ class GuiHand : public GuiLayer
const MTGHand* hand; const MTGHand* hand;
JQuad *back; JQuad *back;
vector<CardView*> cards; vector<CardView*> cards;
CardSelector* cs;
public: public:
GuiHand(CardSelector* cs, MTGHand* hand); GuiHand(MTGHand* hand);
~GuiHand(); ~GuiHand();
void Update(float dt); void Update(float dt);
bool isInHand(CardView*); bool isInHand(CardView*);
@@ -49,7 +48,7 @@ class GuiHand : public GuiLayer
class GuiHandOpponent : public GuiHand class GuiHandOpponent : public GuiHand
{ {
public: public:
GuiHandOpponent(CardSelector* cs, MTGHand* hand); GuiHandOpponent(MTGHand* hand);
virtual void Render(); virtual void Render();
virtual int receiveEventPlus(WEvent* e); virtual int receiveEventPlus(WEvent* e);
virtual int receiveEventMinus(WEvent* e); virtual int receiveEventMinus(WEvent* e);
@@ -66,7 +65,7 @@ class GuiHandSelf : public GuiHand
Pos backpos; Pos backpos;
public: public:
GuiHandSelf(CardSelector* cs, MTGHand* hand); GuiHandSelf(MTGHand* hand);
~GuiHandSelf(); ~GuiHandSelf();
virtual int receiveEventPlus(WEvent* e); virtual int receiveEventPlus(WEvent* e);
virtual int receiveEventMinus(WEvent* e); virtual int receiveEventMinus(WEvent* e);
+1 -2
View File
@@ -71,13 +71,12 @@ class GuiPlay : public GuiLayer
BattleField battleField; BattleField battleField;
Lands selfLands, opponentLands; Lands selfLands, opponentLands;
Spells selfSpells, opponentSpells; Spells selfSpells, opponentSpells;
CardSelector* cs;
iterator end_spells; iterator end_spells;
vector<CardView*> cards; vector<CardView*> cards;
public: public:
GuiPlay(GameObserver*, CardSelector*); GuiPlay(GameObserver*);
~GuiPlay(); ~GuiPlay();
virtual void Render(); virtual void Render();
void Replace(); void Replace();
+1 -2
View File
@@ -83,8 +83,7 @@ void Interruptible::Render(MTGCardInstance * source, JQuad * targetQuad, string
} }
if (bigQuad){ if (bigQuad){
GameObserver * game = GameObserver::GetInstance(); int showMode = CardSelectorSingleton::Instance()->bigMode;
int showMode = game->mLayers->cs->bigMode;
Pos pos = Pos(CardGui::BigWidth / 2, CardGui::BigHeight / 2 - 10, 1.0, 0.0, 220); Pos pos = Pos(CardGui::BigWidth / 2, CardGui::BigHeight / 2 - 10, 1.0, 0.0, 220);
switch(showMode){ switch(showMode){
case BIG_MODE_SHOW: case BIG_MODE_SHOW:
+1 -1
View File
@@ -217,7 +217,7 @@ void CardDisplay::Render(){
Pos pos = Pos(CardGui::BigWidth / 2, CardGui::BigHeight / 2 - 10, 1.0, 0.0, 220); Pos pos = Pos(CardGui::BigWidth / 2, CardGui::BigHeight / 2 - 10, 1.0, 0.0, 220);
int showMode = BIG_MODE_SHOW; int showMode = BIG_MODE_SHOW;
if (game){ if (game){
showMode = game->mLayers->cs->bigMode; showMode = CardSelectorSingleton::Instance()->bigMode;
pos.actY = 150; pos.actY = 150;
if (x < (CardGui::BigWidth / 2)) pos.actX = SCREEN_WIDTH - 10 - CardGui::BigWidth / 2; if (x < (CardGui::BigWidth / 2)) pos.actX = SCREEN_WIDTH - 10 - CardGui::BigWidth / 2;
} }
+28
View File
@@ -1,4 +1,6 @@
#include <iostream> #include <iostream>
#include <assert.h>
#include "../include/PlayGuiObject.h" #include "../include/PlayGuiObject.h"
#include "../include/CardGui.h" #include "../include/CardGui.h"
#include "../include/CardSelector.h" #include "../include/CardSelector.h"
@@ -299,3 +301,29 @@ void CardSelector::PopLimitor() {
Limit(limitorStack.top().first, limitorStack.top().second); Limit(limitorStack.top().first, limitorStack.top().second);
limitorStack.pop(); limitorStack.pop();
} }
namespace CardSelectorSingleton
{
static CardSelector* sCardSelectorInstance = NULL;
CardSelector* Create(DuelLayers* inDuelLayers)
{
if (sCardSelectorInstance == NULL)
sCardSelectorInstance = NEW CardSelector(inDuelLayers);
return sCardSelectorInstance;
}
CardSelector* Instance()
{
assert(sCardSelectorInstance);
return sCardSelectorInstance;
}
void Terminate()
{
SAFE_DELETE(sCardSelectorInstance);
sCardSelectorInstance = NULL;
}
}
+16 -9
View File
@@ -15,7 +15,7 @@ void DuelLayers::init(){
GameObserver* go = GameObserver::GetInstance(); GameObserver* go = GameObserver::GetInstance();
cs = NEW CardSelector(this); mCardSelector = CardSelectorSingleton::Create(this);
//1 Action Layer //1 Action Layer
action = NEW ActionLayer(); action = NEW ActionLayer();
action->Add(NEW MTGGamePhase(action->getMaxId())); action->Add(NEW MTGGamePhase(action->getMaxId()));
@@ -47,11 +47,11 @@ void DuelLayers::init(){
Add(stack = NEW ActionStack(go)); Add(stack = NEW ActionStack(go));
Add(combat = NEW GuiCombat(go)); Add(combat = NEW GuiCombat(go));
Add(action); Add(action);
Add(cs); Add(mCardSelector);
Add(hand = NEW GuiHandSelf(cs, go->players[0]->game->hand)); Add(hand = NEW GuiHandSelf(go->players[0]->game->hand));
Add(avatars = NEW GuiAvatars(cs)); Add(avatars = NEW GuiAvatars());
Add(NEW GuiHandOpponent(cs, go->players[1]->game->hand)); Add(NEW GuiHandOpponent(go->players[1]->game->hand));
Add(NEW GuiPlay(go, cs)); Add(NEW GuiPlay(go));
Add(NEW GuiPhaseBar()); Add(NEW GuiPhaseBar());
Add(NEW GuiFrame()); Add(NEW GuiFrame());
Add(NEW GuiBackground()); Add(NEW GuiBackground());
@@ -69,7 +69,7 @@ void DuelLayers::CheckUserInput(int isAI){
if (avatars->CheckUserInput(key)) break; //avatars need to check their input before action (CTRL_CROSS) if (avatars->CheckUserInput(key)) break; //avatars need to check their input before action (CTRL_CROSS)
if (action->CheckUserInput(key)) break; if (action->CheckUserInput(key)) break;
if (hand->CheckUserInput(key)) break; if (hand->CheckUserInput(key)) break;
if (cs->CheckUserInput(key)) break; if (CardSelectorSingleton::Instance()->CheckUserInput(key)) break;
} }
} }
if(JGE::GetInstance()->GetLeftClickCoordinates(x, y)) if(JGE::GetInstance()->GetLeftClickCoordinates(x, y))
@@ -78,7 +78,7 @@ void DuelLayers::CheckUserInput(int isAI){
{ {
JGE::GetInstance()->LeftClickedProcessed(); JGE::GetInstance()->LeftClickedProcessed();
} }
else if (cs->CheckUserInput(x, y)) else if (CardSelectorSingleton::Instance()->CheckUserInput(x, y))
{ {
JGE::GetInstance()->LeftClickedProcessed(); JGE::GetInstance()->LeftClickedProcessed();
} }
@@ -115,14 +115,21 @@ DuelLayers::DuelLayers() : nbitems(0) {}
DuelLayers::~DuelLayers(){ DuelLayers::~DuelLayers(){
int _nbitems = nbitems; int _nbitems = nbitems;
nbitems = 0; nbitems = 0;
for (int i = 0; i < _nbitems; ++i){ for (int i = 0; i < _nbitems; ++i)
{
if (objects[i] != mCardSelector)
{
delete objects[i]; delete objects[i];
objects[i] = NULL; objects[i] = NULL;
} }
}
for (size_t i = 0; i < waiters.size(); ++i) for (size_t i = 0; i < waiters.size(); ++i)
delete(waiters[i]); delete(waiters[i]);
Trash::cleanup(); Trash::cleanup();
CardSelectorSingleton::Terminate();
mCardSelector = NULL;
} }
void DuelLayers::Add(GuiLayer * layer){ void DuelLayers::Add(GuiLayer * layer){
+8 -3
View File
@@ -5,7 +5,7 @@
#define LIB_GRAVE_OFFSET 230 #define LIB_GRAVE_OFFSET 230
GuiAvatars::GuiAvatars(CardSelector* cs) : cs(cs), active(NULL) GuiAvatars::GuiAvatars() : active(NULL)
{ {
Add(self = NEW GuiAvatar (SCREEN_WIDTH, SCREEN_HEIGHT, false, Add(self = NEW GuiAvatar (SCREEN_WIDTH, SCREEN_HEIGHT, false,
GameObserver::GetInstance()->players[0], GuiAvatar::BOTTOM_RIGHT, this)); GameObserver::GetInstance()->players[0], GuiAvatar::BOTTOM_RIGHT, this));
@@ -22,8 +22,13 @@ GuiAvatars::GuiAvatars(CardSelector* cs) : cs(cs), active(NULL)
Add(opponentGraveyard = NEW GuiGraveyard(5 + GuiAvatar::Width * 1.2 - GuiGameZone::Width / 2, 5, false, GameObserver::GetInstance()->players[1], this)); Add(opponentGraveyard = NEW GuiGraveyard(5 + GuiAvatar::Width * 1.2 - GuiGameZone::Width / 2, 5, false, GameObserver::GetInstance()->players[1], this));
Add(opponentLibrary = NEW GuiLibrary (5 + GuiAvatar::Width *1.2 - GuiGameZone::Width / 2, 5 + GuiGameZone::Height + 5, false, GameObserver::GetInstance()->players[1], this)); Add(opponentLibrary = NEW GuiLibrary (5 + GuiAvatar::Width *1.2 - GuiGameZone::Width / 2, 5 + GuiGameZone::Height + 5, false, GameObserver::GetInstance()->players[1], this));
cs->Add(self); cs->Add(selfGraveyard); cs->Add(selfLibrary); CardSelectorSingleton::Instance()->Add(self);
cs->Add(opponent); cs->Add(opponentGraveyard); cs->Add(opponentLibrary); cs->Add(opponentHand); CardSelectorSingleton::Instance()->Add(selfGraveyard);
CardSelectorSingleton::Instance()->Add(selfLibrary);
CardSelectorSingleton::Instance()->Add(opponent);
CardSelectorSingleton::Instance()->Add(opponentGraveyard);
CardSelectorSingleton::Instance()->Add(opponentLibrary);
CardSelectorSingleton::Instance()->Add(opponentHand);
selfGraveyard->alpha = selfLibrary->alpha = opponentGraveyard->alpha = opponentLibrary->alpha = opponentHand->alpha = 0; selfGraveyard->alpha = selfLibrary->alpha = opponentGraveyard->alpha = opponentLibrary->alpha = opponentHand->alpha = 0;
} }
+8 -8
View File
@@ -25,7 +25,7 @@ bool HandLimitor::greyout(Target* t)
} }
HandLimitor::HandLimitor(GuiHand* hand) : hand(hand) {} HandLimitor::HandLimitor(GuiHand* hand) : hand(hand) {}
GuiHand::GuiHand(CardSelector* cs, MTGHand* hand) : GuiLayer(), hand(hand), cs(cs) GuiHand::GuiHand(MTGHand* hand) : GuiLayer(), hand(hand)
{ {
back = resources.RetrieveTempQuad("handback.png"); back = resources.RetrieveTempQuad("handback.png");
if(back) back->SetTextureRect(1, 0, 100, 250); if(back) back->SetTextureRect(1, 0, 100, 250);
@@ -51,7 +51,7 @@ bool GuiHand::isInHand(CardView* card)
return (it != cards.end()); return (it != cards.end());
} }
GuiHandOpponent::GuiHandOpponent(CardSelector* cs, MTGHand* hand) : GuiHand(cs, hand) {} GuiHandOpponent::GuiHandOpponent(MTGHand* hand) : GuiHand(hand) {}
void GuiHandOpponent::Render() void GuiHandOpponent::Render()
{ {
@@ -68,7 +68,7 @@ void GuiHandOpponent::Render()
} }
} }
GuiHandSelf::GuiHandSelf(CardSelector* cs, MTGHand* hand) : GuiHand(cs, hand), state(Closed), backpos(ClosedX, SCREEN_HEIGHT - 250, 1.0, 0, 255) GuiHandSelf::GuiHandSelf(MTGHand* hand) : GuiHand(hand), state(Closed), backpos(ClosedX, SCREEN_HEIGHT - 250, 1.0, 0, 255)
{ {
limitor = NEW HandLimitor(this); limitor = NEW HandLimitor(this);
if (OptionHandDirection::HORIZONTAL == options[Options::HANDDIRECTION].number) if (OptionHandDirection::HORIZONTAL == options[Options::HANDDIRECTION].number)
@@ -134,9 +134,9 @@ bool GuiHandSelf::CheckUserInput(JButton key)
if (trigger == key) if (trigger == key)
{ {
state = (Open == state ? Closed : Open); state = (Open == state ? Closed : Open);
if (Open == state) cs->Push(); if (Open == state) CardSelectorSingleton::Instance()->Push();
cs->Limit(Open == state ? limitor : NULL, CardSelector::handZone); CardSelectorSingleton::Instance()->Limit(Open == state ? limitor : NULL, CardSelector::handZone);
if (Closed == state) cs->Pop(); if (Closed == state) CardSelectorSingleton::Instance()->Pop();
if (OptionHandDirection::HORIZONTAL == options[Options::HANDDIRECTION].number) if (OptionHandDirection::HORIZONTAL == options[Options::HANDDIRECTION].number)
backpos.y = Open == state ? OpenY : ClosedY; backpos.y = Open == state ? OpenY : ClosedY;
else else
@@ -217,7 +217,7 @@ int GuiHandSelf::receiveEventPlus(WEvent* e)
card = NEW CardView(CardSelector::handZone, ev->card, ClosedRowX, 0); card = NEW CardView(CardSelector::handZone, ev->card, ClosedRowX, 0);
card->t = 6*M_PI; card->t = 6*M_PI;
cards.push_back(card); cards.push_back(card);
cs->Add(card); CardSelectorSingleton::Instance()->Add(card);
Repos(); Repos();
return 1; return 1;
} }
@@ -232,7 +232,7 @@ int GuiHandSelf::receiveEventMinus(WEvent* e)
if (event->card->previous == (*it)->card) if (event->card->previous == (*it)->card)
{ {
CardView* cv = *it; CardView* cv = *it;
cs->Remove(cv); CardSelectorSingleton::Instance()->Remove(cv);
cards.erase(it); cards.erase(it);
Repos(); Repos();
trash(cv); trash(cv);
+4 -3
View File
@@ -112,7 +112,7 @@ void GuiPlay::BattleField::Render()
JRenderer::GetInstance()->FillRect(22, SCREEN_HEIGHT / 2 + 10 - height / 2, 250, height, ARGB(127, red, 0, 0)); JRenderer::GetInstance()->FillRect(22, SCREEN_HEIGHT / 2 + 10 - height / 2, 250, height, ARGB(127, red, 0, 0));
} }
GuiPlay::GuiPlay(GameObserver* game, CardSelector* cs) : game(game), cs(cs) GuiPlay::GuiPlay(GameObserver* game) : game(game)
{ {
end_spells = cards.end(); end_spells = cards.end();
} }
@@ -238,7 +238,7 @@ int GuiPlay::receiveEventPlus(WEvent * e)
cards.push_back(card); cards.push_back(card);
card->t = event->card->isTapped() ? M_PI / 2 : 0; card->t = event->card->isTapped() ? M_PI / 2 : 0;
card->alpha = 255; card->alpha = 255;
cs->Add(card); CardSelectorSingleton::Instance()->Add(card);
Replace(); Replace();
return 1; return 1;
} }
@@ -271,6 +271,7 @@ int GuiPlay::receiveEventPlus(WEvent * e)
Replace(); Replace();
return 0; return 0;
} }
int GuiPlay::receiveEventMinus(WEvent * e) int GuiPlay::receiveEventMinus(WEvent * e)
{ {
if (WEventZoneChange *event = dynamic_cast<WEventZoneChange*>(e)) if (WEventZoneChange *event = dynamic_cast<WEventZoneChange*>(e))
@@ -283,7 +284,7 @@ int GuiPlay::receiveEventMinus(WEvent * e)
if (event->card->previous && event->card->previous->attacker) battleField.removeAttacker(event->card->previous); if (event->card->previous && event->card->previous->attacker) battleField.removeAttacker(event->card->previous);
else if (event->card->attacker) battleField.removeAttacker(event->card); else if (event->card->attacker) battleField.removeAttacker(event->card);
CardView* cv = *it; CardView* cv = *it;
cs->Remove(cv); CardSelectorSingleton::Instance()->Remove(cv);
cards.erase(it); cards.erase(it);
trash(cv); trash(cv);
Replace(); Replace();
+5 -6
View File
@@ -725,12 +725,11 @@ int MTGAttackRule::reactToClick(MTGCardInstance * card){
//Graphically select the next card that can attack //Graphically select the next card that can attack
if(!card->isAttacker()){ if(!card->isAttacker()){
CardSelector * cs = game->mLayers->cs; CardSelectorSingleton::Instance()->PushLimitor();
cs->PushLimitor(); CardSelectorSingleton::Instance()->Limit(this,CardSelector::playZone);
cs->Limit(this,CardSelector::playZone); CardSelectorSingleton::Instance()->CheckUserInput(JGE_BTN_RIGHT);
cs->CheckUserInput(JGE_BTN_RIGHT); CardSelectorSingleton::Instance()->Limit(NULL,CardSelector::playZone);
cs->Limit(NULL,CardSelector::playZone); CardSelectorSingleton::Instance()->PopLimitor();
cs->PopLimitor();
} }
card->toggleAttacker(); card->toggleAttacker();
return 1; return 1;