Tileson  1.3.0
A helpful json parser for Tiled maps
tileson_forward.hpp
Go to the documentation of this file.
1 //
2 // Created by robin on 25.07.2020.
3 //
4 
5 #ifndef TILESON_TILESON_FORWARD_HPP
6 #define TILESON_TILESON_FORWARD_HPP
18 // T i l e . h p p
19 // ---------------------
20 
26 {
27  if(m_map != nullptr)
28  return m_map->getTileSize();
29  else
30  return {0,0};
31 }
32 
34 {
35  if(json.count("id") > 0)
36  {
37  m_id = json["id"].get<uint32_t>() + 1;
38  if (m_tileset != nullptr)
39  m_gid = m_tileset->getFirstgid() + m_id - 1;
40  else
41  m_gid = m_id;
42  manageFlipFlagsByIdThenRemoveFlags(m_gid);
43  return true;
44  }
45  return false;
46 }
47 
52 void tson::Tile::performDataCalculations()
53 {
54  if(m_tileset == nullptr || m_map == nullptr)
55  return;
56 
57  int firstId = m_tileset->getFirstgid(); //First tile id of the tileset
58  int columns = m_tileset->getColumns();
59  int rows = m_tileset->getTileCount() / columns;
60  int lastId = (m_tileset->getFirstgid() + m_tileset->getTileCount()) - 1;
61 
62  if (getGid() >= firstId && getGid() <= lastId)
63  {
64  int baseTilePosition = ((int)getGid() - firstId);
65 
66  int tileModX = (baseTilePosition % columns);
67  int currentRow = (baseTilePosition / columns);
68  int offsetX = (tileModX != 0) ? ((tileModX) * m_map->getTileSize().x) : (0 * m_map->getTileSize().x);
69  int offsetY = (currentRow < rows-1) ? (currentRow * m_map->getTileSize().y) : ((rows-1) * m_map->getTileSize().y);
70 
71  tson::Vector2i spacing = m_tileset->getMarginSpacingOffset({tileModX, currentRow});
72  m_drawingRect = { offsetX + spacing.x, offsetY + spacing.y, m_map->getTileSize().x, m_map->getTileSize().y };
73  }
74  else
75  m_drawingRect = {0, 0, 0, 0};
76 }
77 
82 const tson::Vector2f tson::Tile::getPosition(const std::tuple<int, int> &tileDataPos)
83 {
84  return {((float) std::get<0>(tileDataPos)) * m_drawingRect.width, ((float) std::get<1>(tileDataPos)) * m_drawingRect.height};
85 }
86 
87 // T i l e O b j e c t . h p p
88 // ---------------------
89 
96 void tson::TileObject::initialize(const std::tuple<int, int> &posInTileUnits, tson::Tile *tile)
97 {
98  m_tile = tile;
99  m_posInTileUnits = tile->getPositionInTileUnits(posInTileUnits);
100  m_position = tile->getPosition(posInTileUnits);
101 }
102 
104 {
105  return m_tile->getDrawingRect();
106 }
107 
108 // L a y e r . h p p
109 // -------------------
110 
114 void tson::Layer::decompressData()
115 {
116 
117  tson::DecompressorContainer *container = m_map->getDecompressors();
118  if(container->empty())
119  return;
120 
121  if(m_encoding.empty() && m_compression.empty())
122  return;
123 
124  std::string data = m_base64Data;
125  bool hasBeenDecoded = false;
126  if(!m_encoding.empty() && container->contains(m_encoding))
127  {
128  data = container->get(m_encoding)->decompress(data);
129  hasBeenDecoded = true;
130  }
131 
132  if(!m_compression.empty() && container->contains(m_compression))
133  {
134  data = container->get(m_compression)->decompress(data);
135  }
136 
137  if(hasBeenDecoded)
138  {
139  std::vector<uint8_t> bytes = tson::Tools::Base64DecodedStringToBytes(data);
140  m_data = tson::Tools::BytesToUnsignedInts(bytes);
141  }
142 }
143 
144 // W o r l d . h p p
145 // ------------------
146 
154 {
155  m_maps.clear();
156  std::for_each(m_mapData.begin(), m_mapData.end(), [&](const tson::WorldMapData &data)
157  {
158  if(fs::exists(data.path))
159  {
160  std::unique_ptr<tson::Map> map = parser->parse(data.path);
161  m_maps.push_back(std::move(map));
162  }
163  });
164 
165  return m_maps.size();
166 }
167 
168 
169 #endif //TILESON_TILESON_FORWARD_HPP
Definition: DecompressorContainer.hpp:16
bool contains(std::string_view name) const
Definition: DecompressorContainer.hpp:44
bool empty() const
Definition: DecompressorContainer.hpp:91
IDecompressor< std::string_view, std::string > * get(std::string_view name)
Definition: DecompressorContainer.hpp:77
virtual TOut decompress(const TIn &input)=0
Definition: IJson.hpp:11
T get(std::string_view key)
Definition: IJson.hpp:72
virtual size_t count(std::string_view key) const =0
const Vector2i & getTileSize() const
Definition: Map.hpp:358
Definition: Rect.hpp:11
const tson::Rect & getDrawingRect() const
Definition: tileson_forward.hpp:103
void initialize(const std::tuple< int, int > &posInTileUnits, tson::Tile *tile)
Definition: tileson_forward.hpp:96
Definition: Tile.hpp:22
const tson::Vector2f getPosition(const std::tuple< int, int > &tileDataPos)
Definition: tileson_forward.hpp:82
const tson::Vector2i getTileSize() const
Definition: tileson_forward.hpp:25
bool parseId(IJson &json)
Definition: tileson_forward.hpp:33
const tson::Vector2i getPositionInTileUnits(const std::tuple< int, int > &tileDataPos)
Definition: Tile.hpp:307
Definition: tileson_parser.hpp:54
static std::vector< uint8_t > Base64DecodedStringToBytes(std::string_view str)
Definition: Tools.hpp:29
static std::vector< uint32_t > BytesToUnsignedInts(const std::vector< uint8_t > &bytes)
Definition: Tools.hpp:45
T y
Definition: Vector2.hpp:22
T x
Definition: Vector2.hpp:21
Definition: WorldMapData.hpp:11
int loadMaps(tson::Tileson *parser)
Definition: tileson_forward.hpp:153