diff options
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); |