// // AniTutorialMapControl.h // SteveMaggieCpp // // Created by Katarzyna Kalinowska-Górska on 17.05.2017. // // #ifndef AniTutorialMapControl_h #define AniTutorialMapControl_h #include "AniTouchRecognizerMapControl.h" #include "AniMapUtils.h" #include "MapAdventureObjectSlide.h" class TutorialDataSource; class TutorialDelegate; class AniTutorialMapControl : public AniTouchRecognizerMapControl { public: virtual void install(AniMapLayer* p_AniMapLayer, IMapCharacter* p_controlledCharacter, std::vector p_observers) override; AniTutorialMapControl(TutorialDataSource* p_tutorialDataSource, TutorialDelegate* p_tutorialDelegate) : m_tutorialDataSource(p_tutorialDataSource), m_tutorialDelegate(p_tutorialDelegate) {}; virtual ~AniTutorialMapControl(); void startTutorial(); void forceFinishTutorial(); enum class TutorialPhase { INIT, MOVE_STEVE, TAP_OBJECT, APPROACHING_SLIDE, SLIDE, MOVE_TO_JUMP_SPOT, JUMP_UP, JUMP_LEFT, JUMP_DOWN, JUMP_RIGHT, TICKLE, PRE_ZOOM, ZOOM, POST_ZOOM, FINISHING, FINISHED }; struct CharacterEvent : IMapEvent { cocos2d::Vec2 characterPosition; AniMapUtils::TileData characterTile; }; struct CharacterChangeTileEvent : CharacterEvent { CharacterChangeTileEvent(cocos2d::Vec2 p_position, AniMapUtils::TileData p_tile){ type = "CharacterChangeTileEvent"; characterPosition = p_position; characterTile = p_tile; } }; struct CharacterStopEvent : CharacterEvent { CharacterStopEvent(cocos2d::Vec2 p_position, AniMapUtils::TileData p_tile){ type = "CharacterStopEvent"; characterPosition = p_position; characterTile = p_tile; } }; struct TappedSlideEvent : IMapEvent { MapAdventureObjectSlide* slide { nullptr}; AniMapUtils::TileData tappedTile; TappedSlideEvent(MapAdventureObjectSlide* p_slide, AniMapUtils::TileData p_tile){ type = "TappedSlideEvent"; slide = p_slide; tappedTile = p_tile; } }; struct CharacterStartedSlidingEvent : CharacterEvent { CharacterStartedSlidingEvent(){//cocos2d::Vec2 p_position, cocos2d::Vec2 p_tile){ type = "CharacterStartedSlidingEvent"; // characterPosition = p_position; // characterTile = p_tile; } }; struct CharacterFinishedSlidingEvent : CharacterEvent { CharacterFinishedSlidingEvent(){//cocos2d::Vec2 p_position, cocos2d::Vec2 p_tile){ type = "CharacterFinishedSlidingEvent"; // characterPosition = p_position; // characterTile = p_tile; } }; struct CharacterStartedJumpingEvent : CharacterEvent { CharacterStartedJumpingEvent(cocos2d::Vec2 p_position, AniMapUtils::TileData p_tile){ type = "CharacterStartedJumpingEvent"; characterPosition = p_position; characterTile = p_tile; } }; struct CharacterFinishedJumpingEvent : CharacterEvent { CharacterFinishedJumpingEvent(cocos2d::Vec2 p_position, AniMapUtils::TileData p_tile){ type = "CharacterFinishedJumpingEvent"; characterPosition = p_position; characterTile = p_tile; } }; struct CharacterFinishedLaughingEvent : CharacterEvent { CharacterFinishedLaughingEvent(){ type = "CharacterFinishedLaughingEvent"; } }; struct MapFinishedMovingEvent : IMapEvent { MapFinishedMovingEvent(){ type = "MapFinishedMovingEvent"; } }; struct MapTappedToFinishMovingEvent : IMapEvent { MapTappedToFinishMovingEvent(){ type = "MapTappedToFinishMovingEvent"; } }; virtual void mapEvent(IMapControlInterface* p_controlInterface, IMapEvent* p_mapEvent) override; protected: TutorialDataSource* m_tutorialDataSource {nullptr}; TutorialDelegate* m_tutorialDelegate {nullptr}; AniMapLayer* m_AniMapLayer; IMapCharacter* m_mapCharacter; cocos2d::Sprite* m_finger {nullptr}; TutorialPhase m_tutorialPhase {TutorialPhase::INIT}; bool m_tutorialJumpSubPhaseJumping {false}; // struct { // cocos2d::Vec2 fingerLocationPhaseMove; // cocos2d::Vec2 targetTilePhaseMove; // cocos2d::Vec2 fingerLocationPhaseTapObject; // cocos2d::Vec2 targetTilePhaseTapObject; // } m_tutorialData; virtual void configureTouchAniGestureRecognizer(AniMapLayer* p_AniMapLayer) override; virtual void configureAniTickleGestureRecognizer(IMapCharacter* p_controlledCharacter) override; virtual void configureAniFastSwipeGestureRecognizer(cocos2d::Node* p_controlledCharacter) override; virtual void configureAniTapGestureRecognizer(AniMapLayer* p_AniMapLayer) override; virtual void configureAniLongPressGestureRecognizer(IMapCharacter* p_controlledCharacter) override; void startTapObjectPhase(); void moveToJumpingSpot(); void startJumpUpPhase(); void startJumpDownPhase(); void startJumpLeftPhase(); void startJumpRightPhase(); void startTicklePhase(); void startMapMovePhase(); void startMapTapToCancelMovePhase(); void finishTutorial(bool silent = false); void praiseAndNextPhase(std::function nextPhaseFunction); void blinkFingerAtMapLocation(cocos2d::Vec2 p_mapLocation); void blinkFingerAtScreenLocation(cocos2d::Vec2 p_mapLocation); void swipeFingerAtMapLocations(cocos2d::Vec2 p_mapLocationFrom, cocos2d::Vec2 p_mapLocationTo, float moveTime, float pauseTime); void moveFingerBackAndForthAtMapLocations(cocos2d::Vec2 p_mapLocationFrom, cocos2d::Vec2 p_mapLocationTo, float moveTime, float pauseTime); void hideFinger(); void setDarknessRevealParams(cocos2d::Vec2 p_revealCircleMiddle, float p_revealCircleRadius); }; class TutorialDataSource { public: virtual std::string soundPathForPhaseMove(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) = 0; virtual cocos2d::Point mapPointForMoveSteveFinger(AniTutorialMapControl* p_mapControl) = 0; virtual std::vector mapTilesForMoveSteveEnd(AniTutorialMapControl* p_mapControl) = 0; virtual cocos2d::Vec2 cancelZoomButtonPosition(AniTutorialMapControl* p_mapControl) = 0; virtual std::string soundPathForPhaseTapObject(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) = 0; virtual cocos2d::Point mapPointForTapObjectFinger(AniTutorialMapControl* p_mapControl) = 0; virtual std::string soundPathForPhaseJumpUp(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) = 0; virtual std::string soundPathForPhaseJumpDown(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) = 0; virtual std::string soundPathForPhaseJumpLeft(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) = 0; virtual std::string soundPathForPhaseJumpRight(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) = 0; virtual std::string soundPathForPhaseTickle(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) = 0; virtual std::string soundPathForPhaseMoveMap(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) = 0; virtual std::string soundPathForPhaseTapToFinishMovingMap(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) = 0; virtual std::string soundPathForTutorialFinished(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) = 0; }; class TutorialDelegate { public: virtual void tutorialFinished(AniTutorialMapControl* p_mapControl) = 0; }; #endif /* AniTutorialMapControl_h */