diff --git a/projects/mtg/Makefile b/projects/mtg/Makefile index 4463dfd10..ae6ea0eed 100644 --- a/projects/mtg/Makefile +++ b/projects/mtg/Makefile @@ -1,4 +1,4 @@ -OBJS = objs/AbilityParser.o objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIHints.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIPlayerBaka.o objs/AIStats.o objs/AllAbilities.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardPrimitive.o objs/CardSelector.o objs/CardSelectorSingleton.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckEditorMenu.o objs/DeckMenu.o objs/DeckMenuItem.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o objs/DeckManager.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GameStateStory.o objs/GameStateTransitions.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/IconButton.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/ModRules.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGPack.o objs/MTGRules.o objs/Navigator.o objs/ObjectAnalytics.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/PlayRestrictions.o objs/Pos.o objs/PrecompiledHeader.o objs/PriceList.o objs/ReplacementEffects.o objs/Rules.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/SimplePad.o objs/SimplePopup.o objs/StoryFlow.o objs/StyleManager.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/ThisDescriptor.o objs/Token.o objs/Translate.o objs/TranslateKeys.o objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o objs/WFont.o +OBJS = objs/AbilityParser.o objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIHints.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIPlayerBaka.o objs/AIStats.o objs/AllAbilities.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardPrimitive.o objs/CardSelector.o objs/CardSelectorSingleton.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckEditorMenu.o objs/DeckMenu.o objs/DeckMenuItem.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o objs/DeckManager.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GameStateStory.o objs/GameStateTransitions.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/IconButton.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/ModRules.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGPack.o objs/MTGRules.o objs/Navigator.o objs/ObjectAnalytics.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/PlayRestrictions.o objs/Pos.o objs/PrecompiledHeader.o objs/PriceList.o objs/ReplacementEffects.o objs/Rules.o objs/SimpleMenu.o objs/SimpleButton.o objs/SimpleMenuItem.o objs/SimplePad.o objs/SimplePopup.o objs/StoryFlow.o objs/StyleManager.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/ThisDescriptor.o objs/Token.o objs/Translate.o objs/TranslateKeys.o objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o objs/WFont.o DEPS = $(patsubst objs/%.o, deps/%.d, $(OBJS)) RESULT = $(shell psp-config --psp-prefix 2> Makefile.cache) diff --git a/projects/mtg/include/DeckMenu.h b/projects/mtg/include/DeckMenu.h index ba570dc7c..7b5b17c9d 100644 --- a/projects/mtg/include/DeckMenu.h +++ b/projects/mtg/include/DeckMenu.h @@ -9,9 +9,13 @@ #include "hge/hgeparticle.h" #include "DeckMetaData.h" #include "TextScroller.h" +#include "InteractiveButton.h" class DeckMenu: public JGuiController { +private: + InteractiveButton *dismissButton; + protected: float mHeight, mWidth, mX, mY; @@ -62,14 +66,14 @@ public: DeckMetaData * getSelectedDeck(); void enableDisplayDetailsOverride(); bool showDetailsScreen(); + + virtual bool isClosed() const { return mClosed; } + virtual int getSelectedDeckId() const { return mSelectedDeckId; } - bool isClosed() const { return mClosed; } - int getSelectedDeckId() const { return mSelectedDeckId; } - - void Render(); - void Update(float dt); - void Add(int id, const char * Text, string desc = "", bool forceFocus = false, DeckMetaData *deckMetaData = NULL); - void Close(); + virtual void Render(); + virtual void Update(float dt); + virtual void Add(int id, const char * Text, string desc = "", bool forceFocus = false, DeckMetaData *deckMetaData = NULL); + virtual void Close(); void updateScroller(); void RenderBackground(); void RenderDeckManaColors(); diff --git a/projects/mtg/include/DeckMenuItem.h b/projects/mtg/include/DeckMenuItem.h index 9168b733b..91ec93bc7 100644 --- a/projects/mtg/include/DeckMenuItem.h +++ b/projects/mtg/include/DeckMenuItem.h @@ -15,7 +15,7 @@ private: bool mScrollEnabled; bool mDisplayInitialized; - DeckMenu* parent; + DeckMenu* deckController; float mTitleResetWidth; protected: @@ -43,6 +43,7 @@ public: virtual bool Leaving(JButton key); virtual bool ButtonPressed(); virtual ostream& toString(ostream& out) const; + virtual JGuiController* getParent() const; virtual void RenderWithOffset(float yOffset); }; diff --git a/projects/mtg/include/InteractiveButton.h b/projects/mtg/include/InteractiveButton.h new file mode 100644 index 000000000..4181836b1 --- /dev/null +++ b/projects/mtg/include/InteractiveButton.h @@ -0,0 +1,41 @@ +// +// InteractiveButton.h +// +// Created by Michael Nguyen on 1/23/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#ifndef wagic_InteractiveButton_h +#define wagic_InteractiveButton_h + +#include +#include +#include +#include "WResource_Fwd.h" +#include "SimpleButton.h" + +using std::string; + +#define SCALE_SELECTED 1.2f +#define SCALE_NORMAL 1.0f + +class InteractiveButton: public SimpleButton +{ +private: + JQuadPtr buttonImage; + JButton mActionKey; + +public: + InteractiveButton(JGuiController* _parent, int id, int fontId, string text, float x, float y, JButton actionKey, bool hasFocus = false, bool autoTranslate = false); + + virtual void Entering(); + virtual bool ButtonPressed(); + virtual void setImage( const JQuadPtr imagePtr, float xOffset = 0, float yOffset = 0); + virtual void checkUserClick(); +//virtual void Update(float dt); + virtual void Render(); + virtual ostream& toString(ostream& out) const; + +}; + +#endif diff --git a/projects/mtg/include/PrecompiledHeader.h b/projects/mtg/include/PrecompiledHeader.h index a9359bcdf..c33a12335 100644 --- a/projects/mtg/include/PrecompiledHeader.h +++ b/projects/mtg/include/PrecompiledHeader.h @@ -23,4 +23,8 @@ #include +#if defined (IOS) || defined (ANDROID) +#define TOUCH_ENABLED +#endif + #endif //PRECOMPILEDHEADER_H diff --git a/projects/mtg/include/SimpleButton.h b/projects/mtg/include/SimpleButton.h new file mode 100644 index 000000000..6fc91031b --- /dev/null +++ b/projects/mtg/include/SimpleButton.h @@ -0,0 +1,84 @@ +// +// SimpleButton.h +// - base class for creating buttons/links inside of the game engine. +// +// Created by Michael Nguyen on 1/21/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#ifndef wagic_SimpleButton_h +#define wagic_SimpleButton_h + +#include +#include +#include + +using std::string; + +#define SCALE_SELECTED 1.2f +#define SCALE_NORMAL 1.0f + +class SimpleButton: public JGuiObject +{ +private: + + float mScale; + float mTargetScale; + bool mHasFocus; + bool mIsValidSelection; + float mX; + float mY; + +protected: + float mYOffset; + JGuiController* parent; + int mFontId; + string mText; + float mXOffset; + +public: + + SimpleButton(int id); + SimpleButton(JGuiController* _parent, int id, int fontId, string text, float x, float y, bool hasFocus = false, bool autoTranslate = false); + + virtual float getScale() const; + virtual float getTargetScale() const; + virtual JGuiController* getParent() const; + + virtual int getFontId() const; + virtual void setFontId( const int& fontId ); + virtual void setX( const float& x ) { mX = x; }; + virtual void setY( const float& y ) { mY = y; }; + + virtual void setIsSelectionValid( bool validSelection ); + virtual void setFocus(bool value); + virtual void setText( const string& text); + + virtual bool isSelectionValid() const; + virtual bool hasFocus() const; + virtual string getText() const; + float getX() const; + float getY() const; + virtual void checkUserClick(); + + virtual float GetWidth(); + virtual void Relocate(float x, float y); + + virtual void RenderWithOffset(float yOffset); + virtual void Render(); + virtual void Update(float dt); + + virtual void Entering(); + virtual bool Leaving(JButton key); + virtual bool ButtonPressed(); + virtual ostream& toString(ostream& out) const; + virtual bool getTopLeft(float& top, float& left) + { + top = mY + mYOffset; + left = mX; + return true; + } + ; +}; + +#endif diff --git a/projects/mtg/include/SimpleMenu.h b/projects/mtg/include/SimpleMenu.h index 000b1a0f9..320043cbd 100644 --- a/projects/mtg/include/SimpleMenu.h +++ b/projects/mtg/include/SimpleMenu.h @@ -39,17 +39,17 @@ public: bool isMultipleChoice; SimpleMenu(JGE*, int id, JGuiListener* listener, int fontId, float x, float y, const char * _title = "", int _maxItems = 7, bool centerHorizontal = true, bool centerVertical = true); virtual ~SimpleMenu(); - void Render(); - void Update(float dt); - void Add(int id, const char * Text, string desc = "", bool forceFocus = false); + virtual void Render(); + virtual void Update(float dt); + virtual void Add(int id, const char * Text, string desc = "", bool forceFocus = false); int getmCurr(){return mCurr;} float getWidth(){return mWidth; } - void Close(); + virtual void Close(); void RecenterMenu(); float selectionTargetY; - bool isClosed() + virtual bool isClosed() const { return mClosed; } diff --git a/projects/mtg/include/SimpleMenuItem.h b/projects/mtg/include/SimpleMenuItem.h index eb4f7d6a9..d535cf317 100644 --- a/projects/mtg/include/SimpleMenuItem.h +++ b/projects/mtg/include/SimpleMenuItem.h @@ -4,6 +4,7 @@ #include #include #include +#include "SimpleButton.h" #include "SimpleMenu.h" using std::string; @@ -11,65 +12,20 @@ using std::string; #define SCALE_SELECTED 1.2f #define SCALE_NORMAL 1.0f -class SimpleMenuItem: public JGuiObject +class SimpleMenuItem: public SimpleButton { private: - - SimpleMenu* parent; - float mScale; - float mTargetScale; - bool mHasFocus; - bool mIsValidSelection; - float mX; - float mY; - -protected: - int mFontId; - string mText; - static float mYOffset; - float mXOffset; string mDescription; public: SimpleMenuItem(int id); SimpleMenuItem(SimpleMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus = false, bool autoTranslate = false); - virtual int getFontId() const; - virtual void setFontId( const int& fontId ); - virtual void setX( const float& x ) { mX = x; }; - virtual void setY( const float& y ) { mY = y; }; - - virtual void setIsSelectionValid( bool validSelection ); - virtual void setFocus(bool value); - virtual void setDescription( const string& desc ); - virtual void setText( const string& text); - - virtual bool isSelectionValid() const; - virtual bool hasFocus() const; - virtual string getDescription() const; - virtual string getText() const; - float getX() const; - float getY() const; - virtual void checkUserClick(); - - virtual float GetWidth() const; - virtual void Relocate(float x, float y); - - virtual void RenderWithOffset(float yOffset); - virtual void Render(); - virtual void Update(float dt); - virtual void Entering(); - virtual bool Leaving(JButton key); - virtual bool ButtonPressed(); + virtual void setDescription( const string& desc ); + virtual string getDescription() const; virtual ostream& toString(ostream& out) const; - virtual bool getTopLeft(float& top, float& left) - { - top = mY + mYOffset; - left = mX; - return true; - } - ; + }; #endif diff --git a/projects/mtg/include/SimplePopup.h b/projects/mtg/include/SimplePopup.h index aacdd2da9..21bd52c52 100644 --- a/projects/mtg/include/SimplePopup.h +++ b/projects/mtg/include/SimplePopup.h @@ -35,7 +35,7 @@ private: public: bool autoTranslate; - SimplePopup(int id, JGuiListener* listener, const int fontId, const char * _title = "", DeckMetaData* deckInfo = NULL, MTGAllCards * collection = NULL); + SimplePopup(int id, JGuiListener* listener, const int fontId, const char * _title = "", DeckMetaData* deckInfo = NULL, MTGAllCards * collection = NULL, int x = 364, int y = 235); ~SimplePopup(void); void drawBoundingBox(float x, float y, float width, float height); bool isClosed() diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp index 88eea7fcd..e5fb26145 100644 --- a/projects/mtg/src/DeckMenu.cpp +++ b/projects/mtg/src/DeckMenu.cpp @@ -3,12 +3,12 @@ #include "DeckMenu.h" #include "DeckMenuItem.h" #include "DeckMetaData.h" +#include "InteractiveButton.h" #include "JTypes.h" #include "GameApp.h" #include "Translate.h" #include "TextScroller.h" #include "Tasks.h" -#include "IconButton.h" #include @@ -100,6 +100,13 @@ JGuiController(JGE::GetInstance(), id, listener), fontId(fontId), mShowDetailsSc if (NULL == stars) stars = NEW hgeParticleSystem(WResourceManager::Instance()->RetrievePSI("stars.psi", WResourceManager::Instance()->GetQuad("stars").get())); stars->FireAt(mX, mY); + + const string detailedInfoString = _("Detailed Info"); + float stringWidth = mFont->GetStringWidth(detailedInfoString.c_str()); + float boxStartX = detailedInfoBoxX - stringWidth / 2 + 20; + + dismissButton = NEW InteractiveButton( this, kDetailedInfoButtonId, Fonts::MAIN_FONT, detailedInfoString, boxStartX, detailedInfoBoxY, JGE_BTN_CANCEL); + JGuiController::Add(dismissButton, true); updateScroller(); } @@ -201,7 +208,7 @@ void DeckMenu::initMenuItems() pspIcons[i] = WResourceManager::Instance()->RetrieveQuad("iconspsp.png", (float) i * 32, 0, 32, 32, buf); pspIcons[i]->SetHotSpot(16, 16); } - + dismissButton->setImage(pspIcons[5]); } void DeckMenu::Render() @@ -216,14 +223,12 @@ void DeckMenu::Render() timeOpen = 0; menuInitialized = true; } + if (timeOpen < 1) height *= timeOpen > 0 ? timeOpen : -timeOpen; - + for (int i = startId; i < startId + maxItems; i++) { - if (i > mCount - 1) break; - if (mObjects[i]->GetId() >= kDetailedInfoButtonId) - break; // objects with id > 9999 are clickable buttons - + if (i > mCount - 1) break; DeckMenuItem *currentMenuItem = static_cast (mObjects[i]); if (currentMenuItem->getY() - kLineHeight * startId < mY + height - kLineHeight + 7) { @@ -242,17 +247,13 @@ void DeckMenu::Render() // display the "more info" button if special condition is met if (showDetailsScreen()) { - float pspIconsSize = 0.5; - const string detailedInfoString = _("Detailed Info"); - float stringWidth = mainFont->GetStringWidth(detailedInfoString.c_str()); - float boxStartX = detailedInfoBoxX - stringWidth / 2; - DWORD currentColor = mainFont->GetColor(); - renderer->FillRoundRect( boxStartX, detailedInfoBoxY - 5, stringWidth, mainFont->GetHeight() + 15, .5, ARGB( 255, 0, 0, 0) ); - renderer->RenderQuad(pspIcons[5].get(), detailedInfoBoxX, detailedInfoBoxY + 2, 0, pspIconsSize, pspIconsSize); - mainFont->SetColor(currentColor); - mainFont->DrawString(detailedInfoString, boxStartX, detailedInfoBoxY + 10); + dismissButton->setIsSelectionValid(true); + dismissButton->Render(); + } + else + { + dismissButton->setIsSelectionValid(false); } - // display the avatar image if (currentMenuItem->imageFilename.size() > 0) { @@ -318,9 +319,12 @@ void DeckMenu::Render() void DeckMenu::Update(float dt) { JGuiController::Update(dt); + if (mCurr > startId + maxItems - 1) startId = mCurr - maxItems + 1; - else if (mCurr < startId) startId = mCurr; + else if (mCurr < startId) + startId = mCurr; + stars->Update(dt); selectionT += 3 * dt; selectionY += (mSelectionTargetY - selectionY) * 8 * dt; @@ -345,6 +349,7 @@ void DeckMenu::Update(float dt) } if (mScroller) mScroller->Update(dt); + } void DeckMenu::Add(int id, const char * text, string desc, bool forceFocus, DeckMetaData * deckMetaData) @@ -405,4 +410,5 @@ DeckMenu::~DeckMenu() { WResourceManager::Instance()->Release(pspIconsTexture); SAFE_DELETE(mScroller); + dismissButton = NULL; } diff --git a/projects/mtg/src/DeckMenuItem.cpp b/projects/mtg/src/DeckMenuItem.cpp index 7b3d99671..363af40e4 100644 --- a/projects/mtg/src/DeckMenuItem.cpp +++ b/projects/mtg/src/DeckMenuItem.cpp @@ -14,7 +14,7 @@ const int kHorizontalScrollSpeed = 30; // higher numbers mean faster scrolling DeckMenuItem::DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus, bool autoTranslate, DeckMetaData *deckMetaData): SimpleMenuItem(NULL, id, fontId, text, x, y, hasFocus, autoTranslate) { mEngine = JGE::GetInstance(); - parent = _parent; + deckController = _parent; WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); meta = deckMetaData; @@ -129,7 +129,7 @@ void DeckMenuItem::Entering() { checkUserClick(); setFocus(true); - parent->mSelectionTargetY = getY(); + deckController->mSelectionTargetY = getY(); } @@ -168,11 +168,17 @@ float DeckMenuItem::GetWidth() ostream& DeckMenuItem::toString(ostream& out) const { return out << "DeckMenuItem ::: mHasFocus : " << hasFocus() - << " ; parent : " << parent + << " ; parent : " << deckController << " ; mText : " << getText() << " ; mX,mY : " << getX() << "," << getY(); } +JGuiController* DeckMenuItem::getParent() const +{ + return deckController; +} + + DeckMenuItem::~DeckMenuItem() { meta = NULL; diff --git a/projects/mtg/src/InteractiveButton.cpp b/projects/mtg/src/InteractiveButton.cpp new file mode 100644 index 000000000..426bf75dd --- /dev/null +++ b/projects/mtg/src/InteractiveButton.cpp @@ -0,0 +1,105 @@ +// +// InteractiveButton.cpp +// wagic +// +// Created by Michael Nguyen on 1/23/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#include +#include "PrecompiledHeader.h" + +#include "InteractiveButton.h" +#include "Translate.h" +#include "JTypes.h" +#include "WResourceManager.h" +#include "WFont.h" + + +InteractiveButton::InteractiveButton(JGuiController* _parent, int id, int fontId, string text, float x, float y, JButton actionKey, bool hasFocus, bool autoTranslate) : +SimpleButton( _parent, id, fontId, text, x, y, hasFocus, autoTranslate) +{ + setIsSelectionValid(false); // by default it's turned off since you can't auto select it. + mActionKey = actionKey; +} + +void InteractiveButton::Entering() +{ +} + +void InteractiveButton::checkUserClick() +{ + int x1 = -1, y1 = -1; + if (mEngine->GetLeftClickCoordinates(x1, y1)) + { + setIsSelectionValid(false); + int buttonImageWidth = static_cast(GetWidth()); + int x2 = static_cast(getX()), y2 = static_cast(getY() + mYOffset); + int buttonHeight = 50; + if ( (x1 >= x2) && (x1 <= (x2 + buttonImageWidth)) && (y1 >= y2) && (y1 < (y2 + buttonHeight))) + setIsSelectionValid( true ); + } + else + setIsSelectionValid( false ); +} + +bool InteractiveButton::ButtonPressed() +{ + checkUserClick(); + if (isSelectionValid()) + { + mEngine->ReadButton(); + mEngine->LeftClickedProcessed(); + mEngine->HoldKey_NoRepeat( mActionKey ); + setIsSelectionValid(false); + return true; + } + + return false; +} + +void InteractiveButton::Render() +{ + if (!isSelectionValid()) return; + JRenderer *renderer = JRenderer::GetInstance(); + WFont *mainFont = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT); + const string detailedInfoString = _(getText()); + float stringWidth = mainFont->GetStringWidth(detailedInfoString.c_str()); + DWORD currentColor = mainFont->GetColor(); +#ifndef TOUCH_ENABLED + mXOffset = stringWidth / 2; + mYOffset = 10; + float boxStartX = getX() - mXOffset; + float pspIconsSize = 0.5; + renderer->FillRoundRect( boxStartX, getY() - 5, stringWidth, mainFont->GetHeight() + 15, .5, ARGB( 255, 0, 0, 0) ); + if (buttonImage != NULL) + renderer->RenderQuad(buttonImage.get(), getX(), getY() + 2, 0, pspIconsSize, pspIconsSize); +#else + mXOffset = 0; + mYOffset = 0; + renderer->FillRoundRect(getX() - 5, getY(), stringWidth + 6, mainFont->GetHeight(), .5, ARGB(255, 192, 172, 119)); + renderer->DrawRoundRect(getX() - 5, getY(), stringWidth + 6, mainFont->GetHeight(), .75, ARGB(255,255,255,255)); +#endif + mainFont->SetColor(currentColor); + mainFont->DrawString(detailedInfoString, getX() - mXOffset, getY() + mYOffset); + +} + +void InteractiveButton::setImage( const JQuadPtr imagePtr, float xOffset, float yOffset) +{ + buttonImage = imagePtr; + mXOffset = xOffset; + mYOffset = yOffset; +} + +/* Accessors */ + +ostream& InteractiveButton::toString(ostream& out) const +{ + return out << "InteractiveButton ::: mHasFocus : " << hasFocus() + << " ; parent : " << getParent() + << " ; mText : " << getText() + << " ; mScale : " << getScale() + << " ; mTargetScale : " << getTargetScale() + << " ; mX,mY : " << getX() << "," << getY(); +} diff --git a/projects/mtg/src/SimpleButton.cpp b/projects/mtg/src/SimpleButton.cpp new file mode 100644 index 000000000..4f4bafc3c --- /dev/null +++ b/projects/mtg/src/SimpleButton.cpp @@ -0,0 +1,188 @@ +// +// SimpleButton.cpp +// wagic +// +// Created by Michael Nguyen on 1/23/12. +// Copyright (c) 2012 Wagic the Homebrew. All rights reserved. +// + +#include "PrecompiledHeader.h" + +#include "SimpleButton.h" +#include "Translate.h" +#include "WFont.h" +#include "WResourceManager.h" + +SimpleButton::SimpleButton(int id): JGuiObject(id) +{ + mIsValidSelection = false; +} + +SimpleButton::SimpleButton(JGuiController* _parent, int id, int fontId, string text, float x, float y, bool hasFocus, bool autoTranslate) : +JGuiObject(id), parent(_parent), mX(x), mY(y), mFontId(fontId) +{ + mYOffset = 0; + if (autoTranslate) + mText = _(text); + else + mText = text; + + mHasFocus = hasFocus; + + mScale = 1.0f; + mTargetScale = 1.0f; + + mXOffset = mX; + + if (hasFocus) + { + setIsSelectionValid(true); + Entering(); + } + else + { + setIsSelectionValid(false); + } +} + + +void SimpleButton::RenderWithOffset(float yOffset) +{ + mYOffset = yOffset; + WFont * mFont = WResourceManager::Instance()->GetWFont(mFontId); + mFont->DrawString(mText.c_str(), mX, mY + yOffset, JGETEXT_CENTER); +} + +void SimpleButton::Render() +{ + RenderWithOffset(0); +} + +void SimpleButton::Update(float dt) +{ + if (mScale < mTargetScale) + { + mScale += 8.0f * dt; + if (mScale > mTargetScale) mScale = mTargetScale; + } + else if (mScale > mTargetScale) + { + mScale -= 8.0f * dt; + if (mScale < mTargetScale) mScale = mTargetScale; + } +} + +void SimpleButton::checkUserClick() +{ + setIsSelectionValid(true); +} + +void SimpleButton::Entering() +{ + checkUserClick(); + mHasFocus = true; +} + +bool SimpleButton::Leaving(JButton key) +{ + checkUserClick(); + mHasFocus = false; + return true; +} + +bool SimpleButton::ButtonPressed() +{ + return mIsValidSelection; +} + + +void SimpleButton::Relocate(float x, float y) +{ + mXOffset = 0; + mX = x; + mY = y; +} + +/* Accessors */ +JGuiController* SimpleButton::getParent() const +{ + return parent; +} + +float SimpleButton::getScale() const +{ + return mScale; +} + +float SimpleButton::getTargetScale() const +{ + return mTargetScale; +} + +float SimpleButton::getX() const +{ + return mX; +} + +float SimpleButton::getY() const +{ + return mY; +} + +void SimpleButton::setFontId(const int &fontId) +{ + mFontId = fontId; +} + +int SimpleButton::getFontId() const +{ + return mFontId; +} + +void SimpleButton::setIsSelectionValid( bool validSelection ) +{ + mIsValidSelection = validSelection; +} + +bool SimpleButton::isSelectionValid() const +{ + return mIsValidSelection; +} + +void SimpleButton::setFocus(bool value) +{ + mHasFocus = value; +} + +bool SimpleButton::hasFocus() const +{ + return mHasFocus; +} + + +string SimpleButton::getText() const +{ + return mText; +} + +void SimpleButton::setText( const string& text) +{ + mText = text; +} + +float SimpleButton::GetWidth() +{ + WFont * mFont = WResourceManager::Instance()->GetWFont(mFontId); + mFont->SetScale(1.0); + return mFont->GetStringWidth(mText.c_str()); +} + +ostream& SimpleButton::toString(ostream& out) const +{ + return out << "SimpleButton ::: mHasFocus : " << hasFocus() + << " ; parent : " << getParent() + << " ; mText : " << getText() + << " ; mScale : " << getScale() + << " ; mTargetScale : " << getTargetScale() + << " ; mX,mY : " << getX() << "," << getY(); +} diff --git a/projects/mtg/src/SimpleMenuItem.cpp b/projects/mtg/src/SimpleMenuItem.cpp index 01c695ba9..d1d0ebb69 100644 --- a/projects/mtg/src/SimpleMenuItem.cpp +++ b/projects/mtg/src/SimpleMenuItem.cpp @@ -4,142 +4,32 @@ #include "Translate.h" #include "WResourceManager.h" -float SimpleMenuItem::mYOffset = 0; -SimpleMenuItem::SimpleMenuItem(int id): JGuiObject(id) +SimpleMenuItem::SimpleMenuItem(int id): SimpleButton(id) { - mIsValidSelection = false; } SimpleMenuItem::SimpleMenuItem(SimpleMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus, bool autoTranslate) : - JGuiObject(id), parent(_parent), mX(x), mY(y), mFontId(fontId) + SimpleButton( _parent, id, fontId, text, x, y, hasFocus, autoTranslate) { - if (autoTranslate) - mText = _(text); - else - mText = text; - + parent = (SimpleMenu *) _parent; mDescription = ""; - - mHasFocus = hasFocus; - - mScale = 1.0f; - mTargetScale = 1.0f; - - mXOffset = mX; - - if (hasFocus) - { - setIsSelectionValid(true); - Entering(); - } - else - { - setIsSelectionValid(false); - } -} - -void SimpleMenuItem::RenderWithOffset(float yOffset) -{ - mYOffset = yOffset; - WFont * mFont = WResourceManager::Instance()->GetWFont(mFontId); - mFont->DrawString(mText.c_str(), mX, mY + yOffset, JGETEXT_CENTER); -} - -void SimpleMenuItem::Render() -{ - RenderWithOffset(0); -} - -void SimpleMenuItem::Update(float dt) -{ - if (mScale < mTargetScale) - { - mScale += 8.0f * dt; - if (mScale > mTargetScale) mScale = mTargetScale; - } - else if (mScale > mTargetScale) - { - mScale -= 8.0f * dt; - if (mScale < mTargetScale) mScale = mTargetScale; - } -} - -void SimpleMenuItem::checkUserClick() -{ - setIsSelectionValid(true); } void SimpleMenuItem::Entering() { checkUserClick(); - mHasFocus = true; - if (parent != NULL) - parent->selectionTargetY = mY; -} + setFocus(true); + if (getParent() != NULL) + { + SimpleMenu *menu = (SimpleMenu *) parent; + menu->selectionTargetY = getY(); + } -bool SimpleMenuItem::Leaving(JButton key) -{ - checkUserClick(); - mHasFocus = false; - return true; -} - -bool SimpleMenuItem::ButtonPressed() -{ - return mIsValidSelection; -} - - -void SimpleMenuItem::Relocate(float x, float y) -{ - mXOffset = x - (parent->getWidth()/2); // determines the leftmost point of the text; - mX = x; - mY = y; } /* Accessors */ -float SimpleMenuItem::getX() const -{ - return mX; -} - -float SimpleMenuItem::getY() const -{ - return mY; -} - -void SimpleMenuItem::setFontId(const int &fontId) -{ - mFontId = fontId; -} - -int SimpleMenuItem::getFontId() const -{ - return mFontId; -} - -void SimpleMenuItem::setIsSelectionValid( bool validSelection ) -{ - mIsValidSelection = validSelection; -} - -bool SimpleMenuItem::isSelectionValid() const -{ - return mIsValidSelection; -} - -void SimpleMenuItem::setFocus(bool value) -{ - mHasFocus = value; -} - -bool SimpleMenuItem::hasFocus() const -{ - return mHasFocus; -} - string SimpleMenuItem::getDescription() const { return mDescription; @@ -150,29 +40,13 @@ void SimpleMenuItem::setDescription( const string& desc ) mDescription = desc; } -string SimpleMenuItem::getText() const -{ - return mText; -} - -void SimpleMenuItem::setText( const string& text) -{ - mText = text; -} - -float SimpleMenuItem::GetWidth() const -{ - WFont * mFont = WResourceManager::Instance()->GetWFont(mFontId); - mFont->SetScale(1.0); - return mFont->GetStringWidth(mText.c_str()); -} ostream& SimpleMenuItem::toString(ostream& out) const { - return out << "SimpleMenuItem ::: mHasFocus : " << mHasFocus - << " ; parent : " << parent - << " ; mText : " << mText - << " ; mScale : " << mScale - << " ; mTargetScale : " << mTargetScale - << " ; mX,mY : " << mX << "," << mY; + return out << "SimpleMenuItem ::: mHasFocus : " << hasFocus() + << " ; parent : " << getParent() + << " ; mText : " << getText() + << " ; mScale : " << getScale() + << " ; mTargetScale : " << getTargetScale() + << " ; mX,mY : " << getX() << "," << getY(); } diff --git a/projects/mtg/src/SimplePopup.cpp b/projects/mtg/src/SimplePopup.cpp index d7434fb95..74d79b42c 100644 --- a/projects/mtg/src/SimplePopup.cpp +++ b/projects/mtg/src/SimplePopup.cpp @@ -3,6 +3,7 @@ * * Created on: Nov 18, 2010 * Author: Michael + * The popups all have a default button created to act as the dismiss button, mapped to JGE_BTN_CANCEL (triangle) with "Detailed Info" to use for the button width. */ #include "PrecompiledHeader.h" @@ -13,7 +14,9 @@ #include "DeckManager.h" #include -SimplePopup::SimplePopup(int id, JGuiListener* listener, const int fontId, const char * _title, DeckMetaData* deckMetaData, MTGAllCards * collection) : +const int kDismissButtonId = 10000; + +SimplePopup::SimplePopup(int id, JGuiListener* listener, const int fontId, const char * _title, DeckMetaData* deckMetaData, MTGAllCards * collection, int cancelX, int cancelY) : JGuiController(JGE::GetInstance(), id, listener), mFontId(fontId), mCollection(collection) { mX = 19; @@ -25,6 +28,8 @@ SimplePopup::SimplePopup(int id, JGuiListener* listener, const int fontId, const mTextFont = WResourceManager::Instance()->GetWFont(fontId); this->mCount = 1; // a hack to ensure the menus do book keeping correctly. Since we aren't adding items to the menu, this is required mStatsWrapper = NULL; + + JGuiController::Add(NEW InteractiveButton(this, kDismissButtonId, Fonts::MAIN_FONT, "Detailed Info", cancelX, cancelY, JGE_BTN_CANCEL), true); Update(deckMetaData); } @@ -36,15 +41,15 @@ void SimplePopup::Render() string detailedInformation = getDetailedInformation(mDeckInformation->getFilename()); const float textHeight = mTextFont->GetHeight() * mMaxLines; - r->DrawRoundRect(mX, mY, mWidth, textHeight, 2.0f, ARGB( 255, 125, 255, 0) ); - r->FillRoundRect(mX, mY, mWidth, textHeight, 2.0f, ARGB( 255, 0, 0, 0 ) ); + r->FillRoundRect(mX, mY + 2, mWidth + 11, textHeight - 12, 2.0f, ARGB( 255, 0, 0, 0 ) ); // currently causes a crash on the PSP when drawing the corners. // TODO: clean up the image ot make it loook cleaner. Find solution to load gfx to not crash PSP #if 0 - drawBoundingBox( mX, mY, mWidth, textHeight ); + r->DrawRoundRect(mX, mY + 2, mWidth + 11, textHeight - 12, 2.0f, ARGB( 255, 125, 255, 0) ); + drawBoundingBox( mX-3, mY, mWidth + 3, textHeight ); #endif - mTextFont->DrawString(detailedInformation.c_str(), mX + 9 , mY + 15); + mTextFont->DrawString(detailedInformation.c_str(), mX + 9 , mY + 10); } @@ -117,10 +122,11 @@ string SimplePopup::getDetailedInformation(string filename) return oss.str(); } - void SimplePopup::Update(float dt) +void SimplePopup::Update(float dt) { JButton key = mEngine->ReadButton(); CheckUserInput(key); + } // drawing routines diff --git a/projects/mtg/wagic.xcodeproj/project.pbxproj b/projects/mtg/wagic.xcodeproj/project.pbxproj index 81dc5b65c..aba647ea9 100755 --- a/projects/mtg/wagic.xcodeproj/project.pbxproj +++ b/projects/mtg/wagic.xcodeproj/project.pbxproj @@ -276,6 +276,10 @@ 12211ED11494823F00641703 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ED01494823E00641703 /* Default@2x.png */; }; 12211ED41494916D00641703 /* Default-Landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ED21494916D00641703 /* Default-Landscape.png */; }; 12211ED51494916D00641703 /* Default-Portrait.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ED31494916D00641703 /* Default-Portrait.png */; }; + 12272FC414CD57CF00192DC7 /* SimpleButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12272FC314CD57CF00192DC7 /* SimpleButton.cpp */; }; + 12272FC514CD57CF00192DC7 /* SimpleButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12272FC314CD57CF00192DC7 /* SimpleButton.cpp */; }; + 12272FC814CD6A3900192DC7 /* InteractiveButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12272FC714CD6A3900192DC7 /* InteractiveButton.cpp */; }; + 12272FC914CD6A3900192DC7 /* InteractiveButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12272FC714CD6A3900192DC7 /* InteractiveButton.cpp */; }; 12769486144127380088F6D3 /* AIPlayerBaka.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12769483144127380088F6D3 /* AIPlayerBaka.cpp */; }; 12769487144127380088F6D3 /* AIPlayerBakaB.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12769484144127380088F6D3 /* AIPlayerBakaB.cpp */; }; 12769488144127380088F6D3 /* TestSuiteAI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12769485144127380088F6D3 /* TestSuiteAI.cpp */; }; @@ -558,6 +562,10 @@ 12211ED01494823E00641703 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "../Default@2x.png"; sourceTree = ""; }; 12211ED21494916D00641703 /* Default-Landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape.png"; path = "../Default-Landscape.png"; sourceTree = ""; }; 12211ED31494916D00641703 /* Default-Portrait.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait.png"; path = "../Default-Portrait.png"; sourceTree = ""; }; + 12272FC114CD558C00192DC7 /* SimpleButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleButton.h; sourceTree = ""; }; + 12272FC314CD57CF00192DC7 /* SimpleButton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleButton.cpp; sourceTree = ""; }; + 12272FC614CD68FB00192DC7 /* InteractiveButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InteractiveButton.h; sourceTree = ""; }; + 12272FC714CD6A3900192DC7 /* InteractiveButton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InteractiveButton.cpp; sourceTree = ""; }; 12769483144127380088F6D3 /* AIPlayerBaka.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AIPlayerBaka.cpp; sourceTree = ""; }; 12769484144127380088F6D3 /* AIPlayerBakaB.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AIPlayerBakaB.cpp; sourceTree = ""; }; 12769485144127380088F6D3 /* TestSuiteAI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TestSuiteAI.cpp; sourceTree = ""; }; @@ -1489,6 +1497,7 @@ CEA376851291C60500B9016A /* include */ = { isa = PBXGroup; children = ( + 12272FC114CD558C00192DC7 /* SimpleButton.h */, 12CCA032144A05DF00E343A0 /* AbilityParser.h */, 127694891441274D0088F6D3 /* AIPlayerBaka.h */, 1276948A1441274D0088F6D3 /* AIPlayerBakaB.h */, @@ -1603,6 +1612,7 @@ CEA376EA1291C60500B9016A /* WFont.h */, CEA376EB1291C60500B9016A /* WGui.h */, CEA376EC1291C60500B9016A /* WResourceManager.h */, + 12272FC614CD68FB00192DC7 /* InteractiveButton.h */, ); path = include; sourceTree = ""; @@ -1720,6 +1730,8 @@ CEA377551291C60500B9016A /* WFont.cpp */, CEA377561291C60500B9016A /* WGui.cpp */, CEA377571291C60500B9016A /* WResourceManager.cpp */, + 12272FC314CD57CF00192DC7 /* SimpleButton.cpp */, + 12272FC714CD6A3900192DC7 /* InteractiveButton.cpp */, ); path = src; sourceTree = ""; @@ -2189,6 +2201,8 @@ 12059E4614980B7300DAC43B /* ZipArchive.mm in Sources */, 12059E4714980B7300DAC43B /* Reachability.m in Sources */, 12059E4814980B7300DAC43B /* WagicDownloadProgressViewController.m in Sources */, + 12272FC514CD57CF00192DC7 /* SimpleButton.cpp in Sources */, + 12272FC914CD6A3900192DC7 /* InteractiveButton.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2397,6 +2411,8 @@ 12211EAF14933D6600641703 /* ZipArchive.mm in Sources */, 12211EB71493483C00641703 /* Reachability.m in Sources */, 12211EC91494360C00641703 /* WagicDownloadProgressViewController.m in Sources */, + 12272FC414CD57CF00192DC7 /* SimpleButton.cpp in Sources */, + 12272FC814CD6A3900192DC7 /* InteractiveButton.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };