GameKit  0.0.1a
C++ gamedev tools
Tilemap.cpp
Go to the documentation of this file.
1 /*
2  * =====================================================================================
3  *
4  * Filename: Tiletilemap.cpp
5  *
6  * Description:
7  *
8  * Created: 15/02/2019 19:18:26
9  *
10  * Author: Quentin Bazin, <quent42340@gmail.com>
11  *
12  * =====================================================================================
13  */
14 #include <algorithm>
15 
16 #include "gk/graphics/Tilemap.hpp"
18 
19 namespace gk {
20 
21 Tilemap::Tilemap(u16 width, u16 height, Tileset &tileset, const std::vector<std::vector<u16>> &data) : m_tileset(tileset) {
22  m_width = width;
23  m_height = height;
24 
25  m_baseData = data;
27 
28  m_animator.init(*this);
30 
31  updateTiles();
32 }
33 
36 }
37 
39  m_animator.animateTiles(*this);
40 }
41 
42 void Tilemap::draw(gk::RenderTarget &target, gk::RenderStates states) const {
43  states.transform *= getTransform();
44 
45  target.draw(m_renderer, states);
46 }
47 
49  for (u8 layer = 0 ; layer < layerCount() ; ++layer) {
50  for (u16 tileY = 0 ; tileY < m_height ; tileY++) {
51  for (u16 tileX = 0 ; tileX < m_width ; tileX++) {
52  u16 tileID = getTile(tileX, tileY, layer);
53 
54  m_renderer.updateTile(layer, tileX, tileY, std::max(0, tileID - m_tilesetOffset), *this);
55  }
56  }
57  }
58 }
59 
60 u16 Tilemap::getTile(u16 tileX, u16 tileY, u8 layer) {
61  if(tileX + tileY * m_width < m_width * m_height) {
62  return m_data[layerCount() - 1 - layer][tileX + tileY * m_width];
63  } else {
64  return 0;
65  }
66 }
67 
68 void Tilemap::setTile(u16 tileX, u16 tileY, u16 id, bool write, bool persistent) {
69  if(write && tileX + tileY * m_width < m_width * m_height) {
70  m_data[layerCount() - 1][tileX + tileY * m_width] = id;
71 
72  if (persistent) m_baseData[layerCount() - 1][tileX + tileY * m_width] = id;
73  }
74 
75  m_renderer.updateTile(layerCount() - 1, tileX, tileY, std::max(0, id - m_tilesetOffset), *this);
76 }
77 
78 bool Tilemap::inTile(float x, float y, u16 tileID) {
79  return getTile(x / m_tileset.tileWidth(),
80  y / m_tileset.tileHeight()) == tileID;
81 }
82 
83 } // namespace gk
84 
u16 getTile(u16 tileX, u16 tileY, u8 layer=0)
Definition: Tilemap.cpp:60
void updateTiles()
Definition: Tilemap.cpp:48
u16 m_tilesetOffset
Definition: Tilemap.hpp:52
void updateTile(u8 layer, u16 tileX, u16 tileY, u16 id, Tilemap &map)
Tileset & m_tileset
Definition: Tilemap.hpp:51
Tilemap(u16 width, u16 height, Tileset &tileset, const std::vector< std::vector< u16 >> &data)
Definition: Tilemap.cpp:21
TilemapRenderer m_renderer
Definition: Tilemap.hpp:61
TilemapAnimator m_animator
Definition: Tilemap.hpp:60
u16 width() const
Definition: Tilemap.hpp:39
unsigned short u16
Definition: IntTypes.hpp:22
unsigned char u8
Definition: IntTypes.hpp:21
void draw(const IDrawable &drawable, const RenderStates &states=RenderStates::Default)
u16 m_height
Definition: Tilemap.hpp:55
Transform transform
void reset()
Definition: Tilemap.cpp:34
void init(Tilemap &map)
void init(Tilemap *map, u16 mapWidth, u16 mapHeight, u8 mapLayers)
const Transform & getTransform() const
std::vector< std::vector< u16 > > m_baseData
Definition: Tilemap.hpp:57
void setTile(u16 tileX, u16 tileY, u16 id, bool write=true, bool persistent=false)
Definition: Tilemap.cpp:68
u16 tileHeight() const
Definition: Tileset.hpp:59
std::vector< std::vector< u16 > > m_data
Definition: Tilemap.hpp:58
u16 height() const
Definition: Tilemap.hpp:40
void update()
Definition: Tilemap.cpp:38
u8 layerCount() const
Definition: Tilemap.hpp:42
bool inTile(float x, float y, u16 tileID)
Definition: Tilemap.cpp:78
u16 m_width
Definition: Tilemap.hpp:54
void draw(gk::RenderTarget &target, gk::RenderStates states) const override
Draw the object to a render target.
Definition: Tilemap.cpp:42
u16 tileWidth() const
Definition: Tileset.hpp:58
void animateTiles(Tilemap &map)