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/renderer.cpp | |
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/renderer.cpp')
-rw-r--r-- | src/renderer.cpp | 72 |
1 files changed, 40 insertions, 32 deletions
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); |