blob: 0c4f9d6e0d2de195d2c01f2ac06781ec81b53674 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#include "map.h"
#include <tmxlite/Map.hpp>
#include <tmxlite/Layer.hpp>
#include <tmxlite/Property.hpp>
#include <tmxlite/TileLayer.hpp>
#include <tmxlite/Tileset.hpp>
#include "renderer.h"
Map::Map(std::string_view filename, Renderer& renderer) {
tmx::Map mapfile;
if (!mapfile.load(filename.data())) {
throw std::invalid_argument("Could not find map file: " + std::string(filename));
}
const tmx::Vector2u& mapSize = mapfile.getTileCount();
mapSize_.x() = mapSize.x;
mapSize_.y() = mapSize.y;
const tmx::Vector2u& tileSize = mapfile.getTileSize();
tileSize_.x() = tileSize.x;
tileSize_.y() = tileSize.y;
int firstGID = 0;
// There should only be one tileset.
const tmx::Tileset& tileset = mapfile.getTilesets()[0];
firstGID = tileset.getFirstGID();
tilesetTextureId_ = renderer.loadImageFromFile(tileset.getImagePath());
tilesetColumns_ = tileset.getColumnCount();
for (const auto& layer : mapfile.getLayers()) {
if (layer->getType() == tmx::Layer::Type::Tile) {
const auto& tileLayer = layer->getLayerAs<tmx::TileLayer>();
std::vector<Tile> tilesToStore;
for (const auto& maptile : tileLayer.getTiles()) {
Tile tile;
tile.id = maptile.ID - firstGID;
tile.flipHorizontal = (maptile.flipFlags & tmx::TileLayer::Horizontal) != 0;
tile.flipVertical = (maptile.flipFlags & tmx::TileLayer::Vertical) != 0;
for (const tmx::Property& property : tileset.getTile(maptile.ID)->properties) {
if (property.getName() == "solid" && property.getBoolValue()) {
tile.blocked = true;
} else if (property.getName() == "runSound") {
tile.step = stepTypeFromString(property.getStringValue());
}
}
tilesToStore.push_back(std::move(tile));
}
layers_.push_back(std::move(tilesToStore));
}
}
}
bool Map::isBlocked(int x, int y) const {
int i = x + y * mapSize_.w();
for (const std::vector<Tile>& layer : layers_) {
if (layer.at(i).blocked) {
return true;
}
}
return false;
}
StepType Map::getStepType(int x, int y) const {
int i = x + y * mapSize_.w();
for (const std::vector<Tile>& layer : layers_) {
if (layer.at(i).step != StepType::none) {
return layer.at(i).step;
}
}
return StepType::none;
}
|