Balda

Parsing TMX Files

May 26th, 2016
59
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "level.h"
  2. #include <iostream>
  3. #include "tinyxml.h"
  4.  
  5. using namespace std;
  6. using namespace sf;
  7.  
  8. int Object::GetPropertyInt(string name)
  9. {
  10.     return atoi(properties[name].c_str());
  11. }
  12.  
  13. float Object::GetPropertyFloat(string name)
  14. {
  15.     return (float)strtod(properties[name].c_str(), NULL);
  16. }
  17.  
  18. string Object::GetPropertyString(string name)
  19. {
  20.     return properties[name];
  21. }
  22.  
  23. bool Level::LoadFromFile(string filename)
  24. {
  25.     TiXmlDocument levelFile(filename.c_str());
  26.  
  27.     if (!levelFile.LoadFile())
  28.     {
  29.         cout << "Map " << filename << ": not loaded" << endl;
  30.         return false;
  31.     }
  32.  
  33.     TiXmlElement *map;
  34.     map = levelFile.FirstChildElement("map");
  35.  
  36.     width = atoi(map->Attribute("width"));
  37.     height = atoi(map->Attribute("height"));
  38.     tileWidth = atoi(map->Attribute("tilewidth"));
  39.     tileHeight = atoi(map->Attribute("tileheight"));
  40.  
  41.     TiXmlElement *tilesetElement;
  42.     tilesetElement = map->FirstChildElement("tileset");
  43.     firstTileID = atoi(tilesetElement->Attribute("firstgid"));
  44.  
  45.     TiXmlElement *image;
  46.     image = tilesetElement->FirstChildElement("image");
  47.     string imagepath = image->Attribute("source");
  48.  
  49.     Image img;
  50.  
  51.     if (!img.loadFromFile(imagepath))
  52.     {
  53.         cout << "Tile sheet: not loaded." << endl;
  54.         return false;
  55.     }
  56.  
  57.     img.createMaskFromColor(Color(109, 159, 185));
  58.     tilesetImage.loadFromImage(img);
  59.     tilesetImage.setSmooth(false);
  60.  
  61.     int columns = tilesetImage.getSize().x / tileWidth;
  62.     int rows = tilesetImage.getSize().y / tileHeight;
  63.  
  64.  
  65.     vector<Rect<int>> subRects;
  66.  
  67.     for (int y = 0; y < rows; y++)
  68.         for (int x = 0; x < columns; x++)
  69.         {
  70.             Rect<int> rect;
  71.  
  72.             rect.top = y * tileHeight;
  73.             rect.height = tileHeight;
  74.             rect.left = x * tileWidth;
  75.             rect.width = tileWidth;
  76.  
  77.             subRects.push_back(rect);
  78.         }
  79.  
  80.     TiXmlElement *layerElement;
  81.     layerElement = map->FirstChildElement("layer");
  82.     while (layerElement)
  83.     {
  84.         Layer layer;
  85.  
  86.         if (layerElement->Attribute("opacity") != NULL)
  87.         {
  88.             float opacity = (float)strtod(layerElement->Attribute("opacity"), NULL);
  89.             layer.opacity = 255 * (int)opacity;
  90.         }
  91.         else
  92.         {
  93.             layer.opacity = 255;
  94.         }
  95.  
  96.         TiXmlElement *layerDataElement;
  97.         layerDataElement = layerElement->FirstChildElement("data");
  98.  
  99.         if (layerDataElement == NULL)
  100.         {
  101.             cout << "Bad map. No layer information found." << endl;
  102.         }
  103.  
  104.         TiXmlElement *tileElement;
  105.         tileElement = layerDataElement->FirstChildElement("tile");
  106.  
  107.         if (tileElement == NULL)
  108.         {
  109.             cout << "Bad map. No tile information found." << endl;
  110.             return false;
  111.         }
  112.  
  113.         int x = 0;
  114.         int y = 0;
  115.  
  116.         while (tileElement)
  117.         {
  118.             int tileGID = atoi(tileElement->Attribute("gid"));
  119.             int subRectToUse = tileGID - firstTileID;
  120.  
  121.             if (subRectToUse >= 0)
  122.             {
  123.                 Sprite sprite;
  124.                 sprite.setTexture(tilesetImage);
  125.                 sprite.setTextureRect(subRects[subRectToUse]);
  126.                 sprite.setPosition(x * (float)tileWidth, y * (float)tileHeight);
  127.                 sprite.setColor(Color(255, 255, 255, layer.opacity));
  128.  
  129.                 layer.tiles.push_back(sprite);
  130.             }
  131.  
  132.             tileElement = tileElement->NextSiblingElement("tile");
  133.  
  134.             x++;
  135.             if (x >= width)
  136.             {
  137.                 x = 0;
  138.                 y++;
  139.                 if (y >= height)
  140.                     y = 0;
  141.             }
  142.         }
  143.  
  144.         layers.push_back(layer);
  145.  
  146.         layerElement = layerElement->NextSiblingElement("layer");
  147.     }
  148.  
  149.     TiXmlElement *objectGroupElement;
  150.  
  151.     if (map->FirstChildElement("objectgroup") != NULL)
  152.     {
  153.         objectGroupElement = map->FirstChildElement("objectgroup");
  154.         while (objectGroupElement)
  155.         {
  156.             TiXmlElement *objectElement;
  157.             objectElement = objectGroupElement->FirstChildElement("object");
  158.  
  159.             while (objectElement)
  160.             {
  161.                 string objectType;
  162.                 if (objectElement->Attribute("type") != NULL)
  163.                 {
  164.                     objectType = objectElement->Attribute("type");
  165.                 }
  166.                 string objectName;
  167.                 if (objectElement->Attribute("name") != NULL)
  168.                 {
  169.                     objectName = objectElement->Attribute("name");
  170.                 }
  171.                 int x = atoi(objectElement->Attribute("x"));
  172.                 int y = atoi(objectElement->Attribute("y"));
  173.  
  174.                 int width, height;
  175.  
  176.                 Sprite sprite;
  177.                 sprite.setTexture(tilesetImage);
  178.                 sprite.setTextureRect(Rect<int>(0, 0, 0, 0));
  179.                 sprite.setPosition((float)x, (float)y);
  180.  
  181.                 if (objectElement->Attribute("width") != NULL)
  182.                 {
  183.                     width = atoi(objectElement->Attribute("width"));
  184.                     height = atoi(objectElement->Attribute("height"));
  185.                 }
  186.                 else
  187.                 {
  188.                     width = subRects[atoi(objectElement->Attribute("gid")) - firstTileID].width;
  189.                     height = subRects[atoi(objectElement->Attribute("gid")) - firstTileID].height;
  190.                     sprite.setTextureRect(subRects[atoi(objectElement->Attribute("gid")) - firstTileID]);
  191.                 }
  192.  
  193.                 Object object;
  194.                 object.name = objectName;
  195.                 object.type = objectType;
  196.                 object.sprite = sprite;
  197.  
  198.                 Rect <int> objectRect;
  199.                 objectRect.top = y;
  200.                 objectRect.left = x;
  201.                 objectRect.height = height;
  202.                 objectRect.width = width;
  203.                 object.rect = objectRect;
  204.  
  205.                 TiXmlElement *properties;
  206.                 properties = objectElement->FirstChildElement("properties");
  207.                 if (properties != NULL)
  208.                 {
  209.                     TiXmlElement *prop;
  210.                     prop = properties->FirstChildElement("property");
  211.                     if (prop != NULL)
  212.                     {
  213.                         while (prop)
  214.                         {
  215.                             string propertyName = prop->Attribute("name");
  216.                             string propertyValue = prop->Attribute("value");
  217.  
  218.                             object.properties[propertyName] = propertyValue;
  219.  
  220.                             prop = prop->NextSiblingElement("property");
  221.                         }
  222.                     }
  223.                 }
  224.  
  225.                 objects.push_back(object);
  226.  
  227.                 objectElement = objectElement->NextSiblingElement("object");
  228.             }
  229.             objectGroupElement = objectGroupElement->NextSiblingElement("objectgroup");
  230.         }
  231.     }
  232.     else
  233.     {
  234.         cout << "No object layers found..." << endl;
  235.     }
  236.  
  237.     return true;
  238. }
  239.  
  240. Object Level::GetObject(string name)
  241. {
  242.     for (unsigned int i = 0; i < objects.size(); i++)
  243.         if (objects[i].name == name)
  244.             return objects[i];
  245. }
  246.  
  247. std::vector<Object> Level::GetAllObjects()
  248. {
  249.     return objects;
  250. };
  251.  
  252. vector<Object> Level::GetObjects(string name)
  253. {
  254.     vector<Object> vec;
  255.     for (unsigned int i = 0; i < objects.size(); i++)
  256.         if (objects[i].name == name)
  257.             vec.push_back(objects[i]);
  258.  
  259.     return vec;
  260. }
  261.  
  262. Vector2i Level::GetTileSize()
  263. {
  264.     return Vector2i(tileWidth, tileHeight);
  265. }
  266.  
  267. void Level::Draw(RenderWindow &window)
  268. {
  269.     for (unsigned int layer = 0; layer < layers.size(); layer++)
  270.         for (unsigned int tile = 0; tile < layers[layer].tiles.size(); tile++)
  271.             window.draw(layers[layer].tiles[tile]);
  272. }
RAW Paste Data