// // SubGameScene.h // SteveAndMaggieGame // // Created by Katarzyna Kalinowska-Górska on 07/05/2019. // #ifndef SubGameScene_h #define SubGameScene_h #include "ParentScene.h" #include "audio/include/AudioEngine.h" #include "GameLifeIndicatorView.h" #include "SettingsLayer.h" class SubGameScene : public ParentScene { public: class GameCreator { public: virtual SubGameScene* createGameScene(int gameId,std::string layoutFilePath) = 0; }; virtual void onEnter() override; // virtual void onExit() override; // virtual void onEnterTransitionDidFinish() override; virtual bool initWithConfiguration(std::string layoutFilePath); virtual ~SubGameScene(); bool isPaused(){return m_pauseState == PauseState::PAUSED;} virtual void pauseGame() { m_pauseState = PauseState::PAUSED; } virtual void resumeGame() { m_pauseState = PauseState::RUNNING; } virtual void presentGameResumeLayer(); enum class PauseState { RUNNING, PAUSED }; protected: enum class PlayState { INIT, PRE_PLAYING, PLAYING, CHANGING_LEVEL, LOST, WON }; enum class ItemType : int { NONE = 0, ONE = 1, TWO = 2, THREE = 3, FOUR = 4 }; class Item { public: cocos2d::Sprite* sprite; cocos2d::Rect rect; ItemType type; bool operator==(const Item& item2) { if(sprite == nullptr || item2.sprite == nullptr){ return false; } return sprite->getTag() == item2.sprite->getTag(); } virtual ~Item(){ if(sprite != nullptr){ sprite->removeFromParent(); } } }; // state variables class GameState { public: PlayState playState; bool settingsMenuShown; bool tosAcceptMenuShown; std::map items; int currentLevel; int currentItemTypeIndex; std::vector itemTypeOrder; //the order of the types to catch (shuffled randomly at the beginning of each level) bool itemVanishingMode; float timeCount; float lossTimeCount; bool lossHalfTime; int wrongItemCount; virtual ~GameState(){} }; PauseState m_pauseState { PauseState::RUNNING }; GameState* gameState; SettingsLayer* settingsMenu; GameLifeIndicatorView* lifeIndicatorView; void addLivesIndicatorView(); bool isShowingSettings {false}; virtual void prepareSettingsMenu(); virtual void showSettingsMenu(bool animated = true); virtual void hideSettingsMenu(bool animated = true); //TODO move all these to an interface maybe? virtual void hideSettingsMenuWithLevelReset() { hideSettingsMenu(); } virtual void moveSettingsButtonToFront(int localZOrder); virtual GameState* createGameState(); virtual void removeGameState(); virtual void clearGameState(); virtual void clearAllItems(); virtual bool touchHandlerForWidget(std::string objectName, cocos2d::ui::Widget::TouchEventType touchEventType) override; virtual bool onPrevLevelButtonClicked(); virtual bool onReplayButtonClicked(); virtual bool onNextLevelButtonClicked(); virtual bool onFastForwardButtonClicked(); virtual void startGame(bool playIntro = true) = 0; virtual void gameWon(); virtual void gameLost(); virtual void resetGame(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) cocos2d::EventListenerKeyboard* _keyboardListener; void addBackButtonListener(){ _keyboardListener = cocos2d::EventListenerKeyboard::create(); _keyboardListener->onKeyReleased = [&](cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event){ if(keyCode == cocos2d::EventKeyboard::KeyCode::KEY_BACK){ if(!gameState->settingsMenuShown && !gameState->tosAcceptMenuShown){ pauseGame(); MiscUtils::showAppCloseConfirmDialog([&](){ resumeGame(); }); } } }; cocos2d::Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(_keyboardListener, this); } #endif }; #endif /* SubGameScene_h */