#pragma once #include #include #include "math.hpp" #include "tile.hpp" class Map { // TODO using = ... for tile vector public: static constexpr float TILE_SIZE = 100.0f; // tile size in world Map(int rows, int cols) : m_Cols(cols), m_Rows(rows) { bool sw = true; LOG_DEBUG("cols = ", cols, " rows = ", rows); m_Tiles = std::vector>{}; for (size_t row = 0; row < m_Rows; row++) { m_Tiles.push_back(std::vector{}); for (size_t col = 0; col < m_Cols; col++) { if (sw) m_Tiles[row].push_back(&tile_types.at("Grass")); else m_Tiles[row].push_back(&tile_types.at("Road")); sw = !sw; } sw = !sw; } } Map() : Map(0, 0) {} const std::vector> &GetMapTiles() const { return m_Tiles; } WorldPos TileToWorld(TilePos p) const { return WorldPos{p.x * TILE_SIZE, p.y * TILE_SIZE}; } TilePos WorldToTile(WorldPos p) const { return TilePos{p.x / TILE_SIZE, p.y / TILE_SIZE}; } Vec2D GetTileSize() const { return Vec2D{TILE_SIZE, TILE_SIZE}; } const Tile* GetTileAt(TilePos p) const { assert(IsTilePosValid(p)); size_t row = p.x; size_t col = p.y; return m_Tiles[row][col]; } const Tile* GetTileAt(WorldPos p) const { return GetTileAt(WorldToTile(p)); } bool IsTilePosValid(TilePos p) const { size_t row = p.x; size_t col = p.y; return row < m_Tiles.size() && col < m_Tiles[0].size(); } template double GetTileVelocityCoeff(T p) const { return 1.0 / GetTileAt(p)->cost; } private: // std::vector> m_Tiles; std::vector> m_Tiles; size_t m_Cols = 0; size_t m_Rows = 0; };