summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/map.cpp25
-rw-r--r--src/map.h7
-rw-r--r--src/renderer.cpp72
-rw-r--r--src/renderer.h6
4 files changed, 70 insertions, 40 deletions
diff --git a/src/map.cpp b/src/map.cpp index d7c1e7e..4781231 100644 --- a/src/map.cpp +++ b/src/map.cpp
@@ -50,7 +50,18 @@ Map::Map(std::string_view name) : name_(name) {
50 tilesToStore.push_back(std::move(tile)); 50 tilesToStore.push_back(std::move(tile));
51 } 51 }
52 52
53 layers_.push_back(std::move(tilesToStore)); 53 bool above = false;
54 for (const tmx::Property& property : tileLayer.getProperties()) {
55 if (property.getName() == "above" && property.getBoolValue()) {
56 above = true;
57 }
58 }
59
60 if (above) {
61 upperLayers_.push_back(std::move(tilesToStore));
62 } else {
63 lowerLayers_.push_back(std::move(tilesToStore));
64 }
54 } else if (layer->getType() == tmx::Layer::Type::Object) { 65 } else if (layer->getType() == tmx::Layer::Type::Object) {
55 const auto& objectLayer = layer->getLayerAs<tmx::ObjectGroup>(); 66 const auto& objectLayer = layer->getLayerAs<tmx::ObjectGroup>();
56 67
@@ -137,9 +148,13 @@ Map::Map(std::string_view name) : name_(name) {
137} 148}
138 149
139bool Map::isBlocked(int x, int y) const { 150bool Map::isBlocked(int x, int y) const {
151 if (x < 0 || y < 0 || x >= mapSize_.w() || y >= mapSize_.h()) {
152 return false;
153 }
154
140 int i = x + y * mapSize_.w(); 155 int i = x + y * mapSize_.w();
141 156
142 for (const std::vector<Tile>& layer : layers_) { 157 for (const std::vector<Tile>& layer : lowerLayers_) {
143 if (layer.at(i).blocked) { 158 if (layer.at(i).blocked) {
144 return true; 159 return true;
145 } 160 }
@@ -149,9 +164,13 @@ bool Map::isBlocked(int x, int y) const {
149} 164}
150 165
151StepType Map::getStepType(int x, int y) const { 166StepType Map::getStepType(int x, int y) const {
167 if (x < 0 || y < 0 || x >= mapSize_.w() || y >= mapSize_.h()) {
168 return StepType::none;
169 }
170
152 int i = x + y * mapSize_.w(); 171 int i = x + y * mapSize_.w();
153 172
154 for (const std::vector<Tile>& layer : layers_) { 173 for (const std::vector<Tile>& layer : lowerLayers_) {
155 if (layer.at(i).step != StepType::none) { 174 if (layer.at(i).step != StepType::none) {
156 return layer.at(i).step; 175 return layer.at(i).step;
157 } 176 }
diff --git a/src/map.h b/src/map.h index a311be1..9467d75 100644 --- a/src/map.h +++ b/src/map.h
@@ -52,7 +52,9 @@ public:
52 52
53 const vec2i& getTileSize() const { return tileSize_; } 53 const vec2i& getTileSize() const { return tileSize_; }
54 54
55 const std::vector<std::vector<Tile>>& getLayers() const { return layers_; } 55 const std::vector<std::vector<Tile>>& getUpperLayers() const { return upperLayers_; }
56
57 const std::vector<std::vector<Tile>>& getLowerLayers() const { return lowerLayers_; }
56 58
57 const std::string& getTilesetFilename() const { return tilesetFilename_; } 59 const std::string& getTilesetFilename() const { return tilesetFilename_; }
58 60
@@ -75,7 +77,8 @@ private:
75 std::string name_; 77 std::string name_;
76 vec2i mapSize_; 78 vec2i mapSize_;
77 vec2i tileSize_; 79 vec2i tileSize_;
78 std::vector<std::vector<Tile>> layers_; 80 std::vector<std::vector<Tile>> upperLayers_;
81 std::vector<std::vector<Tile>> lowerLayers_;
79 std::string tilesetFilename_; 82 std::string tilesetFilename_;
80 int tilesetColumns_; 83 int tilesetColumns_;
81 std::vector<Prototype> prototypes_; 84 std::vector<Prototype> prototypes_;
diff --git a/src/renderer.cpp b/src/renderer.cpp index f8b2482..3b2bd21 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp
@@ -36,7 +36,7 @@ Renderer::Renderer() {
36 } 36 }
37} 37}
38 38
39texture_ptr Renderer::renderMapLayer(const Map& map, int layer) { 39texture_ptr Renderer::renderMapLayer(const Map& map, bool above) {
40 if (cachedTilesetName_ != map.getTilesetFilename()) { 40 if (cachedTilesetName_ != map.getTilesetFilename()) {
41 surface_ptr pfs(IMG_Load(map.getTilesetFilename().c_str())); 41 surface_ptr pfs(IMG_Load(map.getTilesetFilename().c_str()));
42 if (!pfs) { 42 if (!pfs) {
@@ -64,32 +64,40 @@ texture_ptr Renderer::renderMapLayer(const Map& map, int layer) {
64 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 0); 64 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 0);
65 SDL_RenderClear(ren_.get()); 65 SDL_RenderClear(ren_.get());
66 66
67 const std::vector<Tile>& tiles = map.getLayers().at(layer); 67 const std::vector<std::vector<Tile>>* layers = nullptr;
68 for (int y = 0; y < map.getMapSize().h(); y++) { 68 if (above) {
69 for (int x = 0; x < map.getMapSize().w(); x++) { 69 layers = &map.getUpperLayers();
70 const Tile& tile = tiles.at(x + y * map.getMapSize().w()); 70 } else {
71 71 layers = &map.getLowerLayers();
72 SDL_Rect srcRect { 72 }
73 static_cast<int>((tile.id % map.getTilesetColumns()) * map.getTileSize().w()), 73
74 static_cast<int>((tile.id / map.getTilesetColumns()) * map.getTileSize().h()), 74 for (const std::vector<Tile>& tiles : *layers) {
75 map.getTileSize().w(), 75 for (int y = 0; y < map.getMapSize().h(); y++) {
76 map.getTileSize().h() }; 76 for (int x = 0; x < map.getMapSize().w(); x++) {
77 77 const Tile& tile = tiles.at(x + y * map.getMapSize().w());
78 SDL_Rect destRect { 78
79 x * map.getTileSize().w(), 79 SDL_Rect srcRect {
80 y * map.getTileSize().h(), 80 static_cast<int>((tile.id % map.getTilesetColumns()) * map.getTileSize().w()),
81 map.getTileSize().w(), 81 static_cast<int>((tile.id / map.getTilesetColumns()) * map.getTileSize().h()),
82 map.getTileSize().h() }; 82 map.getTileSize().w(),
83 83 map.getTileSize().h() };
84 SDL_RendererFlip flip = SDL_FLIP_NONE; 84
85 if (tile.flipHorizontal && tile.flipVertical) { 85 SDL_Rect destRect {
86 flip = static_cast<SDL_RendererFlip>(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL); 86 x * map.getTileSize().w(),
87 } else if (tile.flipHorizontal) { 87 y * map.getTileSize().h(),
88 flip = SDL_FLIP_HORIZONTAL; 88 map.getTileSize().w(),
89 } else if (tile.flipVertical) { 89 map.getTileSize().h() };
90 flip = SDL_FLIP_VERTICAL; 90
91 SDL_RendererFlip flip = SDL_FLIP_NONE;
92 if (tile.flipHorizontal && tile.flipVertical) {
93 flip = static_cast<SDL_RendererFlip>(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL);
94 } else if (tile.flipHorizontal) {
95 flip = SDL_FLIP_HORIZONTAL;
96 } else if (tile.flipVertical) {
97 flip = SDL_FLIP_VERTICAL;
98 }
99 SDL_RenderCopyEx(ren_.get(), tilesetTex_.get(), &srcRect, &destRect, 0, nullptr, flip);
91 } 100 }
92 SDL_RenderCopyEx(ren_.get(), tilesetTex_.get(), &srcRect, &destRect, 0, nullptr, flip);
93 } 101 }
94 } 102 }
95 103
@@ -116,8 +124,8 @@ void Renderer::render(Game& game) {
116 124
117 if (cachedMapName_ != game.getMap().getName()) { 125 if (cachedMapName_ != game.getMap().getName()) {
118 cachedMapName_ = game.getMap().getName(); 126 cachedMapName_ = game.getMap().getName();
119 renLay1_ = renderMapLayer(game.getMap(), 0); 127 renLowerLayer_ = renderMapLayer(game.getMap(), false);
120 renLay0_ = renderMapLayer(game.getMap(), 1); 128 renUpperLayer_ = renderMapLayer(game.getMap(), true);
121 129
122 vec2i mapBounds = game.getMap().getMapSize() * game.getMap().getTileSize(); 130 vec2i mapBounds = game.getMap().getMapSize() * game.getMap().getTileSize();
123 mapSwapTex_.reset(SDL_CreateTexture( 131 mapSwapTex_.reset(SDL_CreateTexture(
@@ -150,13 +158,13 @@ void Renderer::render(Game& game) {
150 SDL_RenderClear(ren_.get()); 158 SDL_RenderClear(ren_.get());
151 159
152 // Render lower map layer 160 // Render lower map layer
153 SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, nullptr); 161 SDL_RenderCopy(ren_.get(), renLowerLayer_.get(), nullptr, nullptr);
154 162
155 if (effects.isMapFaded()) { 163 if (effects.isMapFaded()) {
156 SDL_SetRenderTarget(ren_.get(), mapSwapTex_.get()); 164 SDL_SetRenderTarget(ren_.get(), mapSwapTex_.get());
157 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); 165 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0);
158 SDL_RenderClear(ren_.get()); 166 SDL_RenderClear(ren_.get());
159 SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, nullptr); 167 SDL_RenderCopy(ren_.get(), renLowerLayer_.get(), nullptr, nullptr);
160 168
161 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_MOD); 169 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_MOD);
162 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); 170 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255);
@@ -173,13 +181,13 @@ void Renderer::render(Game& game) {
173 } 181 }
174 182
175 // Render upper map layer 183 // Render upper map layer
176 SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, nullptr); 184 SDL_RenderCopy(ren_.get(), renUpperLayer_.get(), nullptr, nullptr);
177 185
178 if (effects.isMapFaded()) { 186 if (effects.isMapFaded()) {
179 SDL_SetRenderTarget(ren_.get(), mapSwapTex_.get()); 187 SDL_SetRenderTarget(ren_.get(), mapSwapTex_.get());
180 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); 188 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0);
181 SDL_RenderClear(ren_.get()); 189 SDL_RenderClear(ren_.get());
182 SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, nullptr); 190 SDL_RenderCopy(ren_.get(), renUpperLayer_.get(), nullptr, nullptr);
183 191
184 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_MOD); 192 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_MOD);
185 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); 193 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255);
diff --git a/src/renderer.h b/src/renderer.h index 489a7ec..4c6ccc4 100644 --- a/src/renderer.h +++ b/src/renderer.h
@@ -138,13 +138,13 @@ private:
138 void renderSprite(const Sprite& sprite); 138 void renderSprite(const Sprite& sprite);
139 139
140 // Map rendering 140 // Map rendering
141 texture_ptr renderMapLayer(const Map& map, int layer); 141 texture_ptr renderMapLayer(const Map& map, bool above);
142 142
143 std::string cachedMapName_; 143 std::string cachedMapName_;
144 std::string cachedTilesetName_; 144 std::string cachedTilesetName_;
145 texture_ptr tilesetTex_; 145 texture_ptr tilesetTex_;
146 texture_ptr renLay0_; 146 texture_ptr renLowerLayer_;
147 texture_ptr renLay1_; 147 texture_ptr renUpperLayer_;
148 texture_ptr mapSwapTex_; 148 texture_ptr mapSwapTex_;
149 149
150 // Text rendering 150 // Text rendering