#include "map.h" #include #include #include #include #include #include "renderer.h" Map::Map(std::string_view filename, Renderer& renderer) { tmx::Map mapfile; if (!mapfile.load(filename.data())) { throw std::invalid_argument("Could not find map file: " + std::string(filename)); } const tmx::Vector2u& mapSize = mapfile.getTileCount(); mapSize_.x() = mapSize.x; mapSize_.y() = mapSize.y; const tmx::Vector2u& tileSize = mapfile.getTileSize(); tileSize_.x() = tileSize.x; tileSize_.y() = tileSize.y; int firstGID = 0; // There should only be one tileset. const tmx::Tileset& tileset = mapfile.getTilesets()[0]; firstGID = tileset.getFirstGID(); tilesetTextureId_ = renderer.loadImageFromFile(tileset.getImagePath()); tilesetColumns_ = tileset.getColumnCount(); for (const auto& layer : mapfile.getLayers()) { if (layer->getType() == tmx::Layer::Type::Tile) { const auto& tileLayer = layer->getLayerAs(); std::vector tilesToStore; for (const auto& maptile : tileLayer.getTiles()) { Tile tile; tile.id = maptile.ID - firstGID; tile.flipHorizontal = (maptile.flipFlags & tmx::TileLayer::Horizontal) != 0; tile.flipVertical = (maptile.flipFlags & tmx::TileLayer::Vertical) != 0; for (const tmx::Property& property : tileset.getTile(maptile.ID)->properties) { if (property.getName() == "solid" && property.getBoolValue()) { tile.blocked = true; } } tilesToStore.push_back(std::move(tile)); } layers_.push_back(std::move(tilesToStore)); } } } bool Map::isBlocked(int x, int y) const { int i = x + y * mapSize_.w(); for (const std::vector& layer : layers_) { if (layer.at(i).blocked) { return true; } } return false; }