diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-22 22:46:44 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-22 22:46:44 -0500 |
commit | 3ecf5bbc1c81908bfd3355999a37e8e96e15b8b5 (patch) | |
tree | 3cb83a80a1f315fb8bc3a918782be2f02d2799ce /src | |
parent | 5e8522258412d05994cc5efa678a1d713cdae718 (diff) | |
download | tanetane-3ecf5bbc1c81908bfd3355999a37e8e96e15b8b5.tar.gz tanetane-3ecf5bbc1c81908bfd3355999a37e8e96e15b8b5.tar.bz2 tanetane-3ecf5bbc1c81908bfd3355999a37e8e96e15b8b5.zip |
Generalized upper/lower layer map rendering
Map layers can have a flag on them that specifies that they should be rendered as part of the upper set (rendered above the normal sprite layer but below the above sprite layer). Also added map connections between hallucination_interior and hallucination_cliff. And named the layers in the map files bc why not.
Diffstat (limited to 'src')
-rw-r--r-- | src/map.cpp | 25 | ||||
-rw-r--r-- | src/map.h | 7 | ||||
-rw-r--r-- | src/renderer.cpp | 72 | ||||
-rw-r--r-- | src/renderer.h | 6 |
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 | ||
139 | bool Map::isBlocked(int x, int y) const { | 150 | bool 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 | ||
151 | StepType Map::getStepType(int x, int y) const { | 166 | StepType 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 | ||
39 | texture_ptr Renderer::renderMapLayer(const Map& map, int layer) { | 39 | texture_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 |