#pragma once #include "Entity.h" #include #include #include #include #include #include #include #include class GameInternal; class Map { public: /*! * \brief Loads a .tmx map * \details Loads a `.tmx` file and extracts all relevant data. Any entities (including tiles) are only spawned once * \param path Path to the `.tmx` map file * \sa Map::generateTiles() */ Map(const char* path); void generateTiles(); //!< Generates the map based on the loaded definition void removeTiles(); //!< Removes all tiles previously generated private: // struct required for initialisation struct MapData { const std::vector* tileSets; const std::vector* mapLayers; const tmx::Vector2u* mapSize; const tmx::Vector2u* mapTileSize; const std::vector* texturePaths; }; struct TileSetData { std::string texturePath{}; tmx::Vector2f textureSize; uint32_t tileCount{}; tmx::Vector2u tileCount2D; uint32_t firstGID{}; }; tmx::Map map; Map::MapData mapData; std::vector> tileConstructors; std::vector tiles; void loadTileLayer(const tmx::TileLayer& layer); // created tile is returned so it can be removed later static Entity* addTile(float x, float y, const tmx::Vector2u& mapTileSize, int u, int v, int zIndex, std::string texturePath, bool hasCollision); template static std::optional getLayerProperty(const std::vector& properties, std::string propertyName) { return std::nullopt; }; };