diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-02 15:36:09 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-02 15:36:09 -0500 |
commit | a475b843e7d37f128ce30140d193f0312aa70c9c (patch) | |
tree | 99432d35d61aa14c1ac17311694a8ae62675d3a6 /src/renderer.cpp | |
parent | 7166c9b831f9c6a50ba42272682b776d01e5703e (diff) | |
download | tanetane-a475b843e7d37f128ce30140d193f0312aa70c9c.tar.gz tanetane-a475b843e7d37f128ce30140d193f0312aa70c9c.tar.bz2 tanetane-a475b843e7d37f128ce30140d193f0312aa70c9c.zip |
Using tmxlite instead of Tileson
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r-- | src/renderer.cpp | 67 |
1 files changed, 38 insertions, 29 deletions
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 @@ | |||
1 | #include "renderer.h" | 1 | #include "renderer.h" |
2 | #include "consts.h" | 2 | #include "consts.h" |
3 | #include "game.h" | 3 | #include "game.h" |
4 | #include "map.h" | ||
4 | 5 | ||
5 | Renderer::Renderer() { | 6 | Renderer::Renderer() { |
6 | win_ = window_ptr( | 7 | win_ = window_ptr( |
@@ -29,14 +30,16 @@ Renderer::Renderer() { | |||
29 | } | 30 | } |
30 | } | 31 | } |
31 | 32 | ||
32 | texture_ptr Renderer::renderMapLayer(const tson::Layer& layer) { | 33 | texture_ptr Renderer::renderMapLayer(const Map& map, int layer) { |
34 | vec2i mapBounds = map.getMapSize() * map.getTileSize(); | ||
35 | |||
33 | texture_ptr canvas( | 36 | texture_ptr canvas( |
34 | SDL_CreateTexture( | 37 | SDL_CreateTexture( |
35 | ren_.get(), | 38 | ren_.get(), |
36 | SDL_PIXELFORMAT_RGBA8888, | 39 | SDL_PIXELFORMAT_RGBA8888, |
37 | SDL_TEXTUREACCESS_TARGET, | 40 | SDL_TEXTUREACCESS_TARGET, |
38 | layer.getMap()->getSize().x * layer.getMap()->getTileSize().x, | 41 | mapBounds.w(), |
39 | layer.getMap()->getSize().y * layer.getMap()->getTileSize().y)); | 42 | mapBounds.h())); |
40 | 43 | ||
41 | SDL_SetTextureBlendMode(canvas.get(), SDL_BLENDMODE_BLEND); | 44 | SDL_SetTextureBlendMode(canvas.get(), SDL_BLENDMODE_BLEND); |
42 | 45 | ||
@@ -45,38 +48,44 @@ texture_ptr Renderer::renderMapLayer(const tson::Layer& layer) { | |||
45 | SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 0); | 48 | SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 0); |
46 | SDL_RenderClear(ren_.get()); | 49 | SDL_RenderClear(ren_.get()); |
47 | 50 | ||
48 | for (auto& [pos, tileObject] : layer.getTileObjects()) { | 51 | const std::vector<Tile>& tiles = map.getLayers().at(layer); |
49 | int x = tileObject.getPosition().x; | 52 | for (int y = 0; y < map.getMapSize().h(); y++) { |
50 | int y = tileObject.getPosition().y; | 53 | for (int x = 0; x < map.getMapSize().w(); x++) { |
51 | tson::Rect tileDestRect = tileObject.getDrawingRect(); | 54 | const Tile& tile = tiles.at(x + y * map.getMapSize().w()); |
52 | SDL_Rect srcRect { tileDestRect.x, tileDestRect.y, tileDestRect.width, tileDestRect.height }; | 55 | |
53 | SDL_Rect destRect { | 56 | SDL_Rect srcRect { |
54 | x, y, tileObject.getTile()->getTileSize().x, tileObject.getTile()->getTileSize().y }; | 57 | static_cast<int>((tile.id % map.getTilesetColumns()) * map.getTileSize().w()), |
55 | 58 | static_cast<int>((tile.id / map.getTilesetColumns()) * map.getTileSize().h()), | |
56 | SDL_RendererFlip flip = SDL_FLIP_NONE; | 59 | map.getTileSize().w(), |
57 | if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Horizontally | tson::TileFlipFlags::Vertically)) { | 60 | map.getTileSize().h() }; |
58 | flip = static_cast<SDL_RendererFlip>(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL); | 61 | |
59 | } else if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Horizontally)) { | 62 | SDL_Rect destRect { |
60 | flip = SDL_FLIP_HORIZONTAL; | 63 | x * map.getTileSize().w(), |
61 | } else if (tileObject.getTile()->hasFlipFlags(tson::TileFlipFlags::Vertically)) { | 64 | y * map.getTileSize().h(), |
62 | flip = SDL_FLIP_VERTICAL; | 65 | map.getTileSize().w(), |
66 | map.getTileSize().h() }; | ||
67 | |||
68 | SDL_RendererFlip flip = SDL_FLIP_NONE; | ||
69 | if (tile.flipHorizontal && tile.flipVertical) { | ||
70 | flip = static_cast<SDL_RendererFlip>(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL); | ||
71 | } else if (tile.flipHorizontal) { | ||
72 | flip = SDL_FLIP_HORIZONTAL; | ||
73 | } else if (tile.flipVertical) { | ||
74 | flip = SDL_FLIP_VERTICAL; | ||
75 | } | ||
76 | SDL_RenderCopyEx(ren_.get(), textures_[map.getTilesetTextureId()].get(), &srcRect, &destRect, 0, nullptr, flip); | ||
63 | } | 77 | } |
64 | SDL_RenderCopyEx(ren_.get(), textures_[tilesetTexId_].get(), &srcRect, &destRect, 0, nullptr, flip); | ||
65 | } | 78 | } |
66 | 79 | ||
67 | return canvas; | 80 | return canvas; |
68 | } | 81 | } |
69 | 82 | ||
70 | void Renderer::render(Game& game) { | 83 | void Renderer::render(Game& game) { |
71 | if (tilesetTexId_ == -1) { | ||
72 | tilesetTexId_ = loadImageFromFile(game.getMap()->getTileset("fromRom")->getImage().c_str()); | ||
73 | } | ||
74 | |||
75 | if (!renLay1_) { | 84 | if (!renLay1_) { |
76 | renLay1_ = renderMapLayer(*game.getMap()->getLayer("Layer 1")); | 85 | renLay1_ = renderMapLayer(game.getMap(), 0); |
77 | } | 86 | } |
78 | if (!renLay0_) { | 87 | if (!renLay0_) { |
79 | renLay0_ = renderMapLayer(*game.getMap()->getLayer("Layer 0")); | 88 | renLay0_ = renderMapLayer(game.getMap(), 1); |
80 | } | 89 | } |
81 | 90 | ||
82 | texture_ptr canvas( | 91 | texture_ptr canvas( |
@@ -91,15 +100,15 @@ void Renderer::render(Game& game) { | |||
91 | throw sdl_error(); | 100 | throw sdl_error(); |
92 | } | 101 | } |
93 | 102 | ||
94 | |||
95 | |||
96 | SDL_SetRenderTarget(ren_.get(), canvas.get()); | 103 | SDL_SetRenderTarget(ren_.get(), canvas.get()); |
97 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); | 104 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); |
98 | SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255); | 105 | SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255); |
99 | SDL_RenderClear(ren_.get()); | 106 | SDL_RenderClear(ren_.get()); |
100 | 107 | ||
108 | vec2i mapBounds = game.getMap().getMapSize() * game.getMap().getTileSize(); | ||
109 | |||
101 | { | 110 | { |
102 | SDL_Rect dest { -80, -80, game.getMap()->getSize().x * game.getMap()->getTileSize().x, game.getMap()->getSize().y * game.getMap()->getTileSize().y }; | 111 | SDL_Rect dest { -80, -80, mapBounds.w(), mapBounds.h() }; |
103 | SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, &dest); | 112 | SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, &dest); |
104 | } | 113 | } |
105 | 114 | ||
@@ -111,7 +120,7 @@ void Renderer::render(Game& game) { | |||
111 | } | 120 | } |
112 | 121 | ||
113 | { | 122 | { |
114 | SDL_Rect dest { -80, -80, game.getMap()->getSize().x * game.getMap()->getTileSize().x, game.getMap()->getSize().y * game.getMap()->getTileSize().y }; | 123 | SDL_Rect dest { -80, -80, mapBounds.w(), mapBounds.h() }; |
115 | SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, &dest); | 124 | SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, &dest); |
116 | } | 125 | } |
117 | 126 | ||