summary refs log tree commit diff stats
path: root/src/renderer.cpp
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2021-02-22 22:46:44 -0500
committerKelly Rauchenberger <fefferburbia@gmail.com>2021-02-22 22:46:44 -0500
commit3ecf5bbc1c81908bfd3355999a37e8e96e15b8b5 (patch)
tree3cb83a80a1f315fb8bc3a918782be2f02d2799ce /src/renderer.cpp
parent5e8522258412d05994cc5efa678a1d713cdae718 (diff)
downloadtanetane-3ecf5bbc1c81908bfd3355999a37e8e96e15b8b5.tar.gz
tanetane-3ecf5bbc1c81908bfd3355999a37e8e96e15b8b5.tar.bz2
tanetane-3ecf5bbc1c81908bfd3355999a37e8e96e15b8b5.zip
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.
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);