Advertisement
Guest User

Map.cpp

a guest
Mar 18th, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.18 KB | None | 0 0
  1. #include "Map.h"
  2. #include <memory>
  3. #include <math.h>
  4. #include <algorithm>
  5. #include <HAPISprites_Lib.h>
  6. #include <iostream> //For testing
  7.  
  8.  
  9. void Map::drawMap()
  10. {
  11.     std::pair<int, int> textureDimensions = std::pair<int, int>(
  12.         m_data[0].m_sprite->FrameWidth(),
  13.         28);
  14.         //m_data[0].m_sprite->FrameHeight());
  15.  
  16.     int access{ 0 };
  17.     for (int y = 0; y < m_mapDimensions.second; y++)
  18.     {
  19.         float yPosEven = (float)(0.5 + y) * textureDimensions.second;
  20.         float yPosOdd = (float)y * textureDimensions.second;
  21.  
  22.         for (int x = 1; x < m_mapDimensions.first; x += 2)
  23.         {
  24.             float xPos = (float)x * textureDimensions.first * 3 / 4;
  25.             //Is Odd
  26.             m_data[access + x].m_sprite->GetTransformComp().SetPosition(HAPISPACE::VectorF(
  27.                 xPos * m_drawScale - m_drawOffset.first,
  28.                 yPosOdd * m_drawScale - m_drawOffset.second));
  29.             m_data[access + x].m_sprite->GetTransformComp().SetScaling(
  30.                 HAPISPACE::VectorF(m_drawScale, m_drawScale));
  31.             m_data[access + x].m_sprite->Render(SCREEN_SURFACE);
  32.         }
  33.         for (int x = 0; x < m_mapDimensions.first; x += 2)
  34.         {
  35.             float xPos = (float)x * textureDimensions.first * 3 / 4;
  36.             //Is even
  37.             m_data[access + x].m_sprite->GetTransformComp().SetPosition(HAPISPACE::VectorF(
  38.                 xPos * m_drawScale - m_drawOffset.first,
  39.                 yPosEven * m_drawScale - m_drawOffset.second));
  40.             m_data[access + x].m_sprite->GetTransformComp().SetScaling(
  41.                 HAPISPACE::VectorF(m_drawScale, m_drawScale));
  42.             m_data[access + x].m_sprite->Render(SCREEN_SURFACE);
  43.         }
  44.         access += m_mapDimensions.first;
  45.     }
  46. }
  47.  
  48.  
  49.  
  50. std::pair<int, int> Map::offsetToCube(std::pair<int, int> offset)
  51. {
  52.     int cubeX = offset.first;
  53.     int cubeY = - offset.first - (offset.second - (offset.first + (offset.first & 1)) / 2);
  54.     int cubeZ = -cubeX - cubeY;
  55.     std::cout << cubeX << ", " << cubeY << ", " << cubeZ << std::endl;//For testing
  56.     return std::pair<int, int>(cubeX, cubeY);
  57. }
  58.  
  59. std::pair<int, int> Map::cubeToOffset(std::pair<int, int> cube)
  60. {
  61.     int offsetX = cube.first;
  62.     int offsetY = -cube.first - cube.second + (cube.first + (cube.first & 1)) / 2;
  63.     std::cout << offsetX << ", " << offsetY << std::endl;//For testing
  64.     return std::pair<int, int>(offsetX, offsetY);
  65. }
  66.  
  67. int Map::cubeDistance(std::pair<int, int> a, std::pair<int, int> b)
  68. {
  69.     int x = abs(a.first - b.first);
  70.     int y = abs(a.second - b.second);
  71.     int z = abs(a.first + a.second - b.first - b.second);
  72.     return std::max(x, std::max(y, z));
  73. }
  74.  
  75. bool Map::inCone(std::pair<int, int> orgHex, std::pair<int, int> testHex, eDirection dir)
  76. {
  77.     std::pair<int, int> diff(testHex.first - orgHex.first, testHex.second - orgHex.second);
  78.     if (dir == eNorth || dir == eSouth)//Axis x = 0
  79.     {
  80.  
  81.     }
  82.     else if (dir == eNorthEast || dir == eSouthWest)//Axis y = 0
  83.     {
  84.  
  85.     }
  86.     else if (dir == eNorthWest || dir == eSouthEast)//Axis z = 0
  87.     {
  88.  
  89.     }
  90.     return true;
  91. }
  92.  
  93. Tile *Map::getTile(std::pair<int, int> coordinate)
  94. {
  95.     //Bounds check
  96.     if (coordinate.first < m_mapDimensions.first &&
  97.         coordinate.second < m_mapDimensions.second &&
  98.         coordinate.first >= 0 &&
  99.         coordinate.second >= 0)
  100.     {
  101.         Tile *result = &m_data[coordinate.first + coordinate.second * m_mapDimensions.first];
  102.         return result;
  103.     }
  104.     /*
  105.     HAPI_Sprites.UserMessage(
  106.         std::string("getTile request out of bounds: " + std::to_string(coordinate.first) +
  107.             ", " + std::to_string(coordinate.second) + " map dimensions are: " +
  108.             std::to_string(m_mapDimensions.first) +", "+ std::to_string(m_mapDimensions.second)),
  109.         "Map error");
  110.     */
  111.     return nullptr;
  112. }
  113.  
  114. std::vector<Tile*> Map::getAdjacentTiles(std::pair<int, int> coord)
  115. {
  116.     std::vector<Tile*> result;
  117.     result.reserve(6);
  118.     if (2 % coord.first == 1)//Is an odd tile
  119.     {
  120.         result.push_back(getTile(std::pair<int, int>(coord.first, coord.second - 1)));//N
  121.         result.push_back(getTile(std::pair<int, int>(coord.first + 1, coord.second - 1)));//NE
  122.         result.push_back(getTile(std::pair<int, int>(coord.first + 1, coord.second)));//SE
  123.         result.push_back(getTile(std::pair<int, int>(coord.first, coord.second + 1)));//S
  124.         result.push_back(getTile(std::pair<int, int>(coord.first - 1, coord.second)));//SW
  125.         result.push_back(getTile(std::pair<int, int>(coord.first - 1, coord.second - 1)));//NW
  126.     }
  127.     else//Is even
  128.     {
  129.         result.push_back(getTile(std::pair<int, int>(coord.first, coord.second - 1)));//N
  130.         result.push_back(getTile(std::pair<int, int>(coord.first + 1, coord.second)));//NE
  131.         result.push_back(getTile(std::pair<int, int>(coord.first + 1, coord.second + 1)));//SE
  132.         result.push_back(getTile(std::pair<int, int>(coord.first, coord.second + 1)));//S
  133.         result.push_back(getTile(std::pair<int, int>(coord.first - 1, coord.second + 1)));//SW
  134.         result.push_back(getTile(std::pair<int, int>(coord.first - 1, coord.second)));//NW
  135.     }
  136.     return result;
  137. }
  138.  
  139. std::vector<Tile*>* Map::getTileRadius(std::pair<int, int> coord, int range)
  140. {
  141.     if (range < 1)
  142.         HAPI_Sprites.UserMessage("getTileRadius range less than 1", "Map error");
  143.    
  144.     int reserveSize{ 0 };
  145.     for (int i = 1; i <= range; i++)
  146.     {
  147.         reserveSize += 6 * i;
  148.     }
  149.     std::vector<Tile*> tileStore;
  150.     tileStore.reserve((size_t)reserveSize);
  151.  
  152.     std::pair<int, int> cubeCoord(offsetToCube(coord));
  153.  
  154.     for (int y = std::max(0, coord.second - range);
  155.         y < std::min(m_mapDimensions.second, coord.second + range + 1);
  156.         y++)
  157.     {
  158.         for (int x = std::max(0, coord.first - range);
  159.             x < std::min(m_mapDimensions.first, coord.first + range + 1);
  160.             x++)
  161.         {
  162.             if (coord.first != x && coord.second != y)
  163.             {
  164.                 if (cubeDistance(cubeCoord, offsetToCube(std::pair<int, int>(x, y))) <= range)
  165.                 {
  166.                     tileStore.push_back(getTile(std::pair<int, int>(x, y)));
  167.                 }
  168.             }
  169.         }
  170.     }
  171.     return &tileStore;
  172. }
  173.  
  174. std::vector<Tile*>* Map::getTileCone(std::pair<int, int> coord, int range, eDirection direction)
  175. {
  176.     if (range < 1)
  177.         HAPI_Sprites.UserMessage("getTileCone range less than 1", "Map error");
  178.  
  179.     int reserveSize{ 0 };
  180.     for (int i = 2; i < range + 2; i++)
  181.     {
  182.         reserveSize += 2 * i;
  183.     }
  184.     std::vector<Tile*> tileStore;
  185.     tileStore.reserve((size_t)reserveSize);
  186.  
  187.     std::pair<int, int> cubeCoord(offsetToCube(coord));
  188.  
  189.     for (int y = std::max(0, coord.second - range);
  190.         y < std::min(m_mapDimensions.second, coord.second + range + 1);
  191.         y++)
  192.     {
  193.         for (int x = std::max(0, coord.first - range);
  194.             x < std::min(m_mapDimensions.first, coord.first + range + 1);
  195.             x++)
  196.         {
  197.             if (coord.first != x && coord.second != y)
  198.             {
  199.                 if (cubeDistance(cubeCoord, offsetToCube(std::pair<int, int>(x, y))) <= range)
  200.                 {
  201.                     tileStore.push_back(getTile(std::pair<int, int>(x, y)));
  202.                 }
  203.             }
  204.         }
  205.     }
  206.     return &tileStore;
  207. }
  208.  
  209. bool Map::moveEntity(std::pair<int, int> originalPos, std::pair<int, int> newPos)
  210. {
  211.     Entity* tmpNew = getTile(newPos)->m_entityOnTile;
  212.     Entity* tmpOld = getTile(originalPos)->m_entityOnTile;
  213.  
  214.     if (tmpNew != nullptr || tmpOld == nullptr)
  215.         return false;
  216.  
  217.     tmpNew = tmpOld;
  218.     tmpOld = nullptr;
  219.     return true;
  220. }
  221.  
  222. void Map::insertEntity(Entity * newEntity, std::pair<int, int> coord)
  223. {
  224.     getTile(coord)->m_entityOnTile = newEntity;
  225. }
  226.  
  227. std::pair<int, int> Map::getTileScreenPos(std::pair<int, int> coord)
  228. {
  229.     std::pair<int, int> textureDimensions = std::pair<int, int>(
  230.         m_data[0].m_sprite->FrameWidth(),
  231.         28);
  232.  
  233.     const int xPos = (coord.first * textureDimensions.first) * 3 / 4;
  234.     const int yPos = ((((1 + coord.first) % 2) + 2 * coord.second)
  235.         * textureDimensions.second) / 2;
  236.     return std::pair<int, int>(
  237.         xPos * m_drawScale - m_drawOffset.first,
  238.         yPos * m_drawScale - m_drawOffset.second);
  239. }
  240.  
  241. Map::Map(int width, int height) :
  242.     m_mapDimensions(std::pair<int, int>(width, height)), m_data(),
  243.     m_drawOffset(std::pair<int, int>(100, 100)),
  244.     m_windDirection(eNorth), m_windStrength(0.0), m_drawScale(2)
  245. {
  246.     m_data.reserve(width * height);
  247.     for (int y = 0; y < height; y++)
  248.     {
  249.         for (int x = 0; x < width; x++)
  250.         {
  251.             Tile tile(eWater, std::string("HexTilesWIthoutBordersSpritesheet.xml"),
  252.                 std::string("Data\\"), std::pair<int, int>(x, y));
  253.             m_data.push_back(tile);
  254.             if (!m_data[x + y * m_mapDimensions.first].m_sprite)
  255.             {
  256.                 HAPI_Sprites.UserMessage("Could not load tile spritesheet", "Error");
  257.                 return;
  258.             }
  259.             //m_data[x + y * m_mapDimensions.first].m_sprite->SetFrameNumber(0);
  260.             //cubeToOffset(offsetToCube(std::pair<int, int>(x, y)));
  261.         }
  262.     }
  263. }
  264.  
  265.  
  266. Map::~Map()
  267. {
  268. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement