From 3ecf5bbc1c81908bfd3355999a37e8e96e15b8b5 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Mon, 22 Feb 2021 22:46:44 -0500 Subject: 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. --- src/renderer.cpp | 72 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 32 deletions(-) (limited to 'src/renderer.cpp') 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() { } } -texture_ptr Renderer::renderMapLayer(const Map& map, int layer) { +texture_ptr Renderer::renderMapLayer(const Map& map, bool above) { if (cachedTilesetName_ != map.getTilesetFilename()) { surface_ptr pfs(IMG_Load(map.getTilesetFilename().c_str())); if (!pfs) { @@ -64,32 +64,40 @@ texture_ptr Renderer::renderMapLayer(const Map& map, int layer) { SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 0); SDL_RenderClear(ren_.get()); - const std::vector& tiles = map.getLayers().at(layer); - for (int y = 0; y < map.getMapSize().h(); y++) { - for (int x = 0; x < map.getMapSize().w(); x++) { - const Tile& tile = tiles.at(x + y * map.getMapSize().w()); - - SDL_Rect srcRect { - static_cast((tile.id % map.getTilesetColumns()) * map.getTileSize().w()), - static_cast((tile.id / map.getTilesetColumns()) * map.getTileSize().h()), - map.getTileSize().w(), - map.getTileSize().h() }; - - SDL_Rect destRect { - x * map.getTileSize().w(), - y * map.getTileSize().h(), - map.getTileSize().w(), - map.getTileSize().h() }; - - SDL_RendererFlip flip = SDL_FLIP_NONE; - if (tile.flipHorizontal && tile.flipVertical) { - flip = static_cast(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL); - } else if (tile.flipHorizontal) { - flip = SDL_FLIP_HORIZONTAL; - } else if (tile.flipVertical) { - flip = SDL_FLIP_VERTICAL; + const std::vector>* layers = nullptr; + if (above) { + layers = &map.getUpperLayers(); + } else { + layers = &map.getLowerLayers(); + } + + for (const std::vector& tiles : *layers) { + for (int y = 0; y < map.getMapSize().h(); y++) { + for (int x = 0; x < map.getMapSize().w(); x++) { + const Tile& tile = tiles.at(x + y * map.getMapSize().w()); + + SDL_Rect srcRect { + static_cast((tile.id % map.getTilesetColumns()) * map.getTileSize().w()), + static_cast((tile.id / map.getTilesetColumns()) * map.getTileSize().h()), + map.getTileSize().w(), + map.getTileSize().h() }; + + SDL_Rect destRect { + x * map.getTileSize().w(), + y * map.getTileSize().h(), + map.getTileSize().w(), + map.getTileSize().h() }; + + SDL_RendererFlip flip = SDL_FLIP_NONE; + if (tile.flipHorizontal && tile.flipVertical) { + flip = static_cast(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL); + } else if (tile.flipHorizontal) { + flip = SDL_FLIP_HORIZONTAL; + } else if (tile.flipVertical) { + flip = SDL_FLIP_VERTICAL; + } + SDL_RenderCopyEx(ren_.get(), tilesetTex_.get(), &srcRect, &destRect, 0, nullptr, flip); } - SDL_RenderCopyEx(ren_.get(), tilesetTex_.get(), &srcRect, &destRect, 0, nullptr, flip); } } @@ -116,8 +124,8 @@ void Renderer::render(Game& game) { if (cachedMapName_ != game.getMap().getName()) { cachedMapName_ = game.getMap().getName(); - renLay1_ = renderMapLayer(game.getMap(), 0); - renLay0_ = renderMapLayer(game.getMap(), 1); + renLowerLayer_ = renderMapLayer(game.getMap(), false); + renUpperLayer_ = renderMapLayer(game.getMap(), true); vec2i mapBounds = game.getMap().getMapSize() * game.getMap().getTileSize(); mapSwapTex_.reset(SDL_CreateTexture( @@ -150,13 +158,13 @@ void Renderer::render(Game& game) { SDL_RenderClear(ren_.get()); // Render lower map layer - SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, nullptr); + SDL_RenderCopy(ren_.get(), renLowerLayer_.get(), nullptr, nullptr); if (effects.isMapFaded()) { SDL_SetRenderTarget(ren_.get(), mapSwapTex_.get()); SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); SDL_RenderClear(ren_.get()); - SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, nullptr); + SDL_RenderCopy(ren_.get(), renLowerLayer_.get(), nullptr, nullptr); SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_MOD); SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); @@ -173,13 +181,13 @@ void Renderer::render(Game& game) { } // Render upper map layer - SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, nullptr); + SDL_RenderCopy(ren_.get(), renUpperLayer_.get(), nullptr, nullptr); if (effects.isMapFaded()) { SDL_SetRenderTarget(ren_.get(), mapSwapTex_.get()); SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); SDL_RenderClear(ren_.get()); - SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, nullptr); + SDL_RenderCopy(ren_.get(), renUpperLayer_.get(), nullptr, nullptr); SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_MOD); SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); -- cgit 1.4.1