summary refs log tree commit diff stats
path: root/src/renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r--src/renderer.cpp72
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
39texture_ptr Renderer::renderMapLayer(const Map& map, int layer) { 39texture_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);