From a475b843e7d37f128ce30140d193f0312aa70c9c Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Tue, 2 Feb 2021 15:36:09 -0500 Subject: Using tmxlite instead of Tileson --- src/renderer.cpp | 67 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 29 deletions(-) (limited to 'src/renderer.cpp') diff --git a/src/renderer.cpp b/src/renderer.cpp index 45b9045..9d20fee 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -1,6 +1,7 @@ #include "renderer.h" #include "consts.h" #include "game.h" +#include "map.h" Renderer::Renderer() { win_ = window_ptr( @@ -29,14 +30,16 @@ Renderer::Renderer() { } } -texture_ptr Renderer::renderMapLayer(const tson::Layer& layer) { +texture_ptr Renderer::renderMapLayer(const Map& map, int layer) { + vec2i mapBounds = map.getMapSize() * map.getTileSize(); + texture_ptr canvas( SDL_CreateTexture( ren_.get(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, - layer.getMap()->getSize().x * layer.getMap()->getTileSize().x, - layer.getMap()->getSize().y * layer.getMap()->getTileSize().y)); + mapBounds.w(), + mapBounds.h())); SDL_SetTextureBlendMode(canvas.get(), SDL_BLENDMODE_BLEND); @@ -45,38 +48,44 @@ texture_ptr Renderer::renderMapLayer(const tson::Layer& layer) { SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 0); SDL_RenderClear(ren_.get()); - for (auto& [pos, tileObject] : layer.getTileObjects()) { - int x = tileObject.getPosition().x; - int y = tileObject.getPosition().y; - tson::Rect tileDestRect = tileObject.getDrawingRect(); - SDL_Rect srcRect { tileDestRect.x, tileDestRect.y, tileDestRect.width, tileDestRect.height }; - SDL_Rect destRect { - x, y, tileObject.getTile()->getTileSize().x, tileObject.getTile()->getTileSize().y }; - - SDL_RendererFlip flip = SDL_FLIP_NONE; - if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Horizontally | tson::TileFlipFlags::Vertically)) { - flip = static_cast(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL); - } else if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Horizontally)) { - flip = SDL_FLIP_HORIZONTAL; - } else if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Vertically)) { - flip = SDL_FLIP_VERTICAL; + 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; + } + SDL_RenderCopyEx(ren_.get(), textures_[map.getTilesetTextureId()].get(), &srcRect, &destRect, 0, nullptr, flip); } - SDL_RenderCopyEx(ren_.get(), textures_[tilesetTexId_].get(), &srcRect, &destRect, 0, nullptr, flip); } return canvas; } void Renderer::render(Game& game) { - if (tilesetTexId_ == -1) { - tilesetTexId_ = loadImageFromFile(game.getMap()->getTileset("fromRom")->getImage().c_str()); - } - if (!renLay1_) { - renLay1_ = renderMapLayer(*game.getMap()->getLayer("Layer 1")); + renLay1_ = renderMapLayer(game.getMap(), 0); } if (!renLay0_) { - renLay0_ = renderMapLayer(*game.getMap()->getLayer("Layer 0")); + renLay0_ = renderMapLayer(game.getMap(), 1); } texture_ptr canvas( @@ -91,15 +100,15 @@ void Renderer::render(Game& game) { throw sdl_error(); } - - SDL_SetRenderTarget(ren_.get(), canvas.get()); SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255); SDL_RenderClear(ren_.get()); + vec2i mapBounds = game.getMap().getMapSize() * game.getMap().getTileSize(); + { - SDL_Rect dest { -80, -80, game.getMap()->getSize().x * game.getMap()->getTileSize().x, game.getMap()->getSize().y * game.getMap()->getTileSize().y }; + SDL_Rect dest { -80, -80, mapBounds.w(), mapBounds.h() }; SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, &dest); } @@ -111,7 +120,7 @@ void Renderer::render(Game& game) { } { - SDL_Rect dest { -80, -80, game.getMap()->getSize().x * game.getMap()->getTileSize().x, game.getMap()->getSize().y * game.getMap()->getTileSize().y }; + SDL_Rect dest { -80, -80, mapBounds.w(), mapBounds.h() }; SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, &dest); } -- cgit 1.4.1