// // AniMapLayer.h // SteveMaggieCpp // // Created by Katarzyna Kalinowska-Górska on 17.05.2017. // // #ifndef AniMapLayer_h #define AniMapLayer_h #include "cocos2d.h" #include "IMapImageObject.h" #include "AniMapUtils.h" #include "AniScenarioObject.h" #include "IMapAdventureObjectMapper.h" #include "IMapController.h" #include "IMapControl.h" #include "IMapControlCoordinator.h" #include "IMapCharacterController.h" #include "IMapCharacter.h" class IMapLayerDataSource { public: // virtual initializers. All these will be deleted here in the map layer; virtual IMapControl* initAllocMapControl() = 0; virtual IMapControlCoordinator* initAllocMapControlCoordinator() = 0; virtual IMapAdventureObjectMapper* initAllocAdventureObjectMapper() = 0; virtual std::vector createAutoreleasedMapCharacters() = 0; // controller at [i] corresponds to a character at [i] virtual std::vector initAllocMapCharacterControllers() = 0; virtual IMapController* initAllocMapController(cocos2d::TMXTiledMap* p_map, IMapAdventureObjectMapper* p_mapper) = 0; }; class IMapLayerDelegate { public: virtual void onMapAdventureObjectEvent(IMapAdventureObject* p_object, IMapAdventureObjectEvent* event){}; virtual void onCharacterFinishedIntroFalling(IMapCharacter* character) {}; }; class AniMapLayer : public cocos2d::LayerColor, public AniScenarioObject, public IMapAdventureObjectDelegate { public: // creating / destructing static AniMapLayer* create(const std::string& resFolder, const std::string& mapPath, const rapidjson::Value* objects = NULL); bool init(const std::string& resFolder, const std::string& mapPath, const rapidjson::Value* objects = NULL); virtual ~AniMapLayer(); // overrides virtual void onEnter() override; virtual void onExit() override; virtual void update(float) override; // setup virtual void setup(IMapLayerDataSource* p_dataSource); virtual cocos2d::Layer* addLayer(cocos2d::TMXTiledMap* p_parentMap); virtual void addObjectLayers(cocos2d::TMXTiledMap* p_parentMap, const rapidjson::Value* objectsData); virtual void fillObjects(cocos2d::TMXTiledMap* p_parentMap, const rapidjson::Value* externalObjectsData); void addNewObject(IMapImageObject* m_mapImageObject); //adds to object layer virtual void reallocMapControl(); virtual void installMapControl(IMapControl* p_newMapControl); // character- related virtual void setChooseRandomSpawnTile(bool chooseRandom); virtual void setSpawnTile(int col, int row); // tiles and movement-related // virtual void setColumnImpassable(int column, bool recalculateMap = true); // virtual void setTileImpassable(AniMapUtils::TileData tile, bool recalculateMap = true); // virtual void setCutRightOnColumn(int column); // set delegate inline void setAniMapLayerDelegate(IMapLayerDelegate* p_delegate){ m_delegate = p_delegate; } IMapController* getMapController() const { return m_mapController; } // Adv object deelgate virtual void onMapAdventureObjectEvent(IMapAdventureObject* p_object, IMapAdventureObjectEvent* event) override; virtual void onOccupiedTilesDataChanged(IMapAdventureObject* p_object) override; virtual void onBlockedTilesDataChanged(IMapAdventureObject* p_object, std::vector p_oldBlockedTiles, std::vector p_newBlockedTiles) override; virtual void spawnCharacters(); virtual void clearCharacters(); bool fastForwardCharacterFall(); // friends friend class DemoHandler; protected: IMapLayerDelegate* m_delegate {nullptr}; IMapLayerDataSource* m_dataSource {nullptr}; IMapControl* m_mapControl {nullptr}; // IMapControlCoordinator* m_mapControlCoordinator {nullptr}; // constants const AniMapUtils::TileData DefaultSpawnTile = AniMapUtils::TileData(0,0); // map IMapAdventureObjectMapper* m_adventureObjectMapper; IMapController* m_mapController; void deleteMap(); void setupDarkness(float p_alpha); // characters std::vector m_mapCharacters; std::vector m_mapCharacterControllers; void attachCharacterControllers(); void attachMapControllerToCharacterControllers(IMapController* p_mapController); IMapCharacter* m_playerCharacter; std::string _resFolder; std::vector _objectLayers; std::map _allObjects; int _defaultCharacterDepth; bool _chooseRandomSpawnTile {false}; AniMapUtils::TileData m_spawnTile {DefaultSpawnTile}; std::map m_mapImageObjects; //temp float _backgroundScale; // deletion void deleteMapControlObjects(); void deleteMapAdventureObjectMapper(); void deleteMapCharacterControllers(); #ifdef DEBUG_MAP_OBJECT_DRAG_AROUND cocos2d::Node* _draggedObject; #endif }; #endif /* AniMapLayer_h */