GameKit  0.0.1a
C++ gamedev tools
TilemapLoader.cpp
Go to the documentation of this file.
1 /*
2  * =====================================================================================
3  *
4  * Filename: TilemapLoader.cpp
5  *
6  * Description:
7  *
8  * Created: 15/02/2019 19:32:33
9  *
10  * Author: Quentin Bazin, <quent42340@gmail.com>
11  *
12  * =====================================================================================
13  */
14 #include "gk/graphics/Tilemap.hpp"
16 
17 namespace gk {
18 
19 void TilemapLoader::load(const char *xmlFilename, ResourceHandler &handler) {
20  XMLFile doc(xmlFilename);
21 
22  tinyxml2::XMLElement *mapElement = doc.FirstChildElement("maps").FirstChildElement("map").ToElement();
23  while(mapElement) {
24  std::string name = mapElement->Attribute("name");
25  std::string tilesetName = mapElement->Attribute("tileset");
26 
27  Tileset &tileset = handler.get<Tileset>(tilesetName);
28 
29  loadMap(name, tileset, handler);
30 
31  mapElement = mapElement->NextSiblingElement("map");
32  }
33 }
34 
35 void TilemapLoader::loadMap(const std::string &name, Tileset &tileset, ResourceHandler &handler) {
36  XMLFile doc("resources/maps/" + name + ".tmx");
37 
38  tinyxml2::XMLElement *mapElement = doc.FirstChildElement("map").ToElement();
39 
40  u16 width = mapElement->IntAttribute("width");
41  u16 height = mapElement->IntAttribute("height");
42 
43  std::vector<std::vector<u16>> data;
44  tinyxml2::XMLElement *layerElement = mapElement->FirstChildElement("layer");
45  while (layerElement) {
46  tinyxml2::XMLElement *tileElement = layerElement->FirstChildElement("data")->FirstChildElement("tile");
47 
48  std::vector<u16> layer;
49  while(tileElement) {
50  s16 tileID = tileElement->IntAttribute("gid") - 1;
51 
52  layer.push_back((tileID >= 0) ? tileID : 0);
53 
54  tileElement = tileElement->NextSiblingElement("tile");
55  }
56 
57  data.emplace_back(std::move(layer));
58 
59  layerElement = layerElement->NextSiblingElement("layer");
60  }
61 
62  handler.add<Tilemap>("map-" + name, width, height, tileset, data);
63 }
64 
65 } // namespace gk
66 
tinyxml2::XMLHandle FirstChildElement(const char *element)
Definition: XMLFile.hpp:30
T & add(const std::string &name, Args &&...args)
unsigned short u16
Definition: IntTypes.hpp:22
void loadMap(const std::string &name, Tileset &tileset, ResourceHandler &handler)
T & get(const std::string &name)
signed short s16
Definition: IntTypes.hpp:18
void load(const char *xmlFilename, ResourceHandler &handler) override