Balda

Level.cpp

May 22nd, 2016
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.83 KB | None | 0 0
  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 << "Loading level "" << filename << "" failed." << 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 << "Failed to load tile sheet." << 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.     vector<Rect<int>> subRects;
  65.  
  66.     for (int y = 0; y < rows; y++)
  67.         for (int x = 0; x < columns; x++)
  68.         {
  69.             Rect<int> rect;
  70.  
  71.             rect.top = y * tileHeight;
  72.             rect.height = tileHeight;
  73.             rect.left = x * tileWidth;
  74.             rect.width = tileWidth;
  75.  
  76.             subRects.push_back(rect);
  77.         }
  78.  
  79.     TiXmlElement *layerElement;
  80.     layerElement = map->FirstChildElement("layer");
  81.     while (layerElement)
  82.     {
  83.         Layer layer;
  84.  
  85.         if (layerElement->Attribute("opacity") != NULL)
  86.         {
  87.             float opacity = (float)strtod(layerElement->Attribute("opacity"), NULL);
  88.             layer.opacity = 255 * (int)opacity;
  89.         }
  90.         else
  91.         {
  92.             layer.opacity = 255;
  93.         }
  94.  
  95.         TiXmlElement *layerDataElement;
  96.         layerDataElement = layerElement->FirstChildElement("data");
  97.  
  98.         if (layerDataElement == NULL)
  99.         {
  100.             cout << "Bad map. No layer information found." << endl;
  101.         }
  102.  
  103.         TiXmlElement *tileElement;
  104.         tileElement = layerDataElement->FirstChildElement("tile");
  105.  
  106.         if (tileElement == NULL)
  107.         {
  108.             cout << "Bad map. No tile information found." << endl;
  109.             return false;
  110.         }
  111.  
  112.         int x = 0;
  113.         int y = 0;
  114.  
  115.         while (tileElement)
  116.         {
  117.             int tileGID = atoi(tileElement->Attribute("gid"));
  118.             int subRectToUse = tileGID - firstTileID;
  119.  
  120.             if (subRectToUse >= 0)
  121.             {
  122.                 Sprite sprite;
  123.                 sprite.setTexture(tilesetImage);
  124.                 sprite.setTextureRect(subRects[subRectToUse]);
  125.                 sprite.setPosition(x * (float)tileWidth, y * (float)tileHeight);
  126.                 sprite.setColor(Color(255, 255, 255, layer.opacity));
  127.  
  128.                 layer.tiles.push_back(sprite);
  129.             }
  130.  
  131.             tileElement = tileElement->NextSiblingElement("tile");
  132.  
  133.             x++;
  134.             if (x >= width)
  135.             {
  136.                 x = 0;
  137.                 y++;
  138.                 if (y >= height)
  139.                     y = 0;
  140.             }
  141.         }
  142.  
  143.         layers.push_back(layer);
  144.  
  145.         layerElement = layerElement->NextSiblingElement("layer");
  146.     }
  147.  
  148.     TiXmlElement *objectGroupElement;
  149.  
  150.     if (map->FirstChildElement("objectgroup") != NULL)
  151.     {
  152.         objectGroupElement = map->FirstChildElement("objectgroup");
  153.         while (objectGroupElement)
  154.         {
  155.             TiXmlElement *objectElement;
  156.             objectElement = objectGroupElement->FirstChildElement("object");
  157.  
  158.             while (objectElement)
  159.             {
  160.                 string objectType;
  161.                 if (objectElement->Attribute("type") != NULL)
  162.                 {
  163.                     objectType = objectElement->Attribute("type");
  164.                 }
  165.                 string objectName;
  166.                 if (objectElement->Attribute("name") != NULL)
  167.                 {
  168.                     objectName = objectElement->Attribute("name");
  169.                 }
  170.                 int x = atoi(objectElement->Attribute("x"));
  171.                 int y = atoi(objectElement->Attribute("y"));
  172.  
  173.                 int width, height;
  174.  
  175.                 Sprite sprite;
  176.                 sprite.setTexture(tilesetImage);
  177.                 sprite.setTextureRect(Rect<int>(0, 0, 0, 0));
  178.                 sprite.setPosition((float)x, (float)y);
  179.  
  180.                 if (objectElement->Attribute("width") != NULL)
  181.                 {
  182.                     width = atoi(objectElement->Attribute("width"));
  183.                     height = atoi(objectElement->Attribute("height"));
  184.                 }
  185.                 else
  186.                 {
  187.                     width = subRects[atoi(objectElement->Attribute("gid")) - firstTileID].width;
  188.                     height = subRects[atoi(objectElement->Attribute("gid")) - firstTileID].height;
  189.                     sprite.setTextureRect(subRects[atoi(objectElement->Attribute("gid")) - firstTileID]);
  190.                 }
  191.  
  192.                 Object object;
  193.                 object.name = objectName;
  194.                 object.type = objectType;
  195.                 object.sprite = sprite;
  196.  
  197.                 Rect <int> objectRect;
  198.                 objectRect.top = y;
  199.                 objectRect.left = x;
  200.                 objectRect.height = height;
  201.                 objectRect.width = width;
  202.                 object.rect = objectRect;
  203.  
  204.                 TiXmlElement *properties;
  205.                 properties = objectElement->FirstChildElement("properties");
  206.                 if (properties != NULL)
  207.                 {
  208.                     TiXmlElement *prop;
  209.                     prop = properties->FirstChildElement("property");
  210.                     if (prop != NULL)
  211.                     {
  212.                         while (prop)
  213.                         {
  214.                             string propertyName = prop->Attribute("name");
  215.                             string propertyValue = prop->Attribute("value");
  216.  
  217.                             object.properties[propertyName] = propertyValue;
  218.  
  219.                             prop = prop->NextSiblingElement("property");
  220.                         }
  221.                     }
  222.                 }
  223.  
  224.                 objects.push_back(object);
  225.  
  226.                 objectElement = objectElement->NextSiblingElement("object");
  227.             }
  228.             objectGroupElement = objectGroupElement->NextSiblingElement("objectgroup");
  229.         }
  230.     }
  231.     else
  232.     {
  233.         cout << "No object layers found..." << endl;
  234.     }
  235.  
  236.     return true;
  237. }
  238.  
  239. Object Level::GetObject(string name)
  240. {
  241.     for (unsigned int i = 0; i < objects.size(); i++)
  242.         if (objects[i].name == name)
  243.             return objects[i];
  244. }
  245.  
  246. vector<Object> Level::GetObjects(string name)
  247. {
  248.     vector<Object> vec;
  249.     for (unsigned int i = 0; i < objects.size(); i++)
  250.         if (objects[i].name == name)
  251.             vec.push_back(objects[i]);
  252.  
  253.     return vec;
  254. }
  255.  
  256. Vector2i Level::GetTileSize()
  257. {
  258.     return Vector2i(tileWidth, tileHeight);
  259. }
  260.  
  261. void Level::Draw(RenderWindow &window)
  262. {
  263.     for (unsigned int layer = 0; layer < layers.size(); layer++)
  264.         for (unsigned int tile = 0; tile < layers[layer].tiles.size(); tile++)
  265.             window.draw(layers[layer].tiles[tile]);
  266. }
Add Comment
Please, Sign In to add comment