summary refs log tree commit diff stats
path: root/src
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
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')
-rw-r--r--src/map.cpp25
-rw-r--r--src/map.h7
-rw-r--r--src/renderer.cpp72
-rw-r--r--src/renderer.h6
4 files changed, 70 insertions, 40 deletions
diff --git a/src/map.cpp b/src/map.cpp index d7c1e7e..4781231 100644 --- a/src/map.cpp +++ b/src/map.cpp
@@ -50,7 +50,18 @@ Map::Map(std::string_view name) : name_(name) {
50 tilesToStore.push_back(std::move(tile)); 50 tilesToStore.push_back(std::move(tile));
51 } 51 }
52 52
53 layers_.push_back(std::move(tilesToStore)); 53 bool above = false;
54 for (const tmx::Property& property : tileLayer.getProperties()) {
55 if (property.getName() == "above" && property.getBoolValue()) {
56 above = true;
57 }
58 }
59
60 if (above) {
61 upperLayers_.push_back(std::move(tilesToStore));
62 } else {
63 lowerLayers_.push_back(std::move(tilesToStore));
64 }
54 } else if (layer->getType() == tmx::Layer::Type::Object) { 65 } else if (layer->getType() == tmx::Layer::Type::Object) {
55 const auto& objectLayer = layer->getLayerAs<tmx::ObjectGroup>(); 66 const auto& objectLayer = layer->getLayerAs<tmx::ObjectGroup>();
56 67
@@ -137,9 +148,13 @@ Map::Map(std::string_view name) : name_(name) {
137} 148}
138 149
139bool Map::isBlocked(int x, int y) const { 150bool Map::isBlocked(int x, int y) const {
151 if (x < 0 || y < 0 || x >= mapSize_.w() || y >= mapSize_.h()) {
152 return false;
153 }
154
140 int i = x + y * mapSize_.w(); 155 int i = x + y * mapSize_.w();
141 156
142 for (const std::vector<Tile>& layer : layers_) { 157 for (const std::vector<Tile>& layer : lowerLayers_) {
143 if (layer.at(i).blocked) { 158 if (layer.at(i).blocked) {
144 return true; 159 return true;
145 } 160 }
@@ -149,9 +164,13 @@ bool Map::isBlocked(int x, int y) const {
149} 164}
150 165
151StepType Map::getStepType(int x, int y) const { 166StepType Map::getStepType(int x, int y) const {
167 if (x < 0 || y < 0 || x >= mapSize_.w() || y >= mapSize_.h()) {
168 return StepType::none;
169 }
170
152 int i = x + y * mapSize_.w(); 171 int i = x + y * mapSize_.w();
153 172
154 for (const std::vector<Tile>& layer : layers_) { 173 for (const std::vector<Tile>& layer : lowerLayers_) {
155 if (layer.at(i).step != StepType::none) { 174 if (layer.at(i).step != StepType::none) {
156 return layer.at(i).step; 175 return layer.at(i).step;
157 } 176 }
diff --git a/src/map.h b/src/map.h index a311be1..9467d75 100644 --- a/src/map.h +++ b/src/map.h
@@ -52,7 +52,9 @@ public:
52 52
53 const vec2i& getTileSize() const { return tileSize_; } 53 const vec2i& getTileSize() const { return tileSize_; }
54 54
55 const std::vector<std::vector<Tile>>& getLayers() const { return layers_; } 55 const std::vector<std::vector<Tile>>& getUpperLayers() const { return upperLayers_; }
56
57 const std::vector<std::vector<Tile>>& getLowerLayers() const { return lowerLayers_; }
56 58
57 const std::string& getTilesetFilename() const { return tilesetFilename_; } 59 const std::string& getTilesetFilename() const { return tilesetFilename_; }
58 60
@@ -75,7 +77,8 @@ private:
75 std::string name_; 77 std::string name_;
76 vec2i mapSize_; 78 vec2i mapSize_;
77 vec2i tileSize_; 79 vec2i tileSize_;
78 std::vector<std::vector<Tile>> layers_; 80 std::vector<std::vector<Tile>> upperLayers_;
81 std::vector<std::vector<Tile>> lowerLayers_;
79 std::string tilesetFilename_; 82 std::string tilesetFilename_;
80 int tilesetColumns_; 83 int tilesetColumns_;
81 std::vector<Prototype> prototypes_; 84 std::vector<Prototype> prototypes_;
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);
diff --git a/src/renderer.h b/src/renderer.h index 489a7ec..4c6ccc4 100644 --- a/src/renderer.h +++ b/src/renderer.h
@@ -138,13 +138,13 @@ private:
138 void renderSprite(const Sprite& sprite); 138 void renderSprite(const Sprite& sprite);
139 139
140 // Map rendering 140 // Map rendering
141 texture_ptr renderMapLayer(const Map& map, int layer); 141 texture_ptr renderMapLayer(const Map& map, bool above);
142 142
143 std::string cachedMapName_; 143 std::string cachedMapName_;
144 std::string cachedTilesetName_; 144 std::string cachedTilesetName_;
145 texture_ptr tilesetTex_; 145 texture_ptr tilesetTex_;
146 texture_ptr renLay0_; 146 texture_ptr renLowerLayer_;
147 texture_ptr renLay1_; 147 texture_ptr renUpperLayer_;
148 texture_ptr mapSwapTex_; 148 texture_ptr mapSwapTex_;
149 149
150 // Text rendering 150 // Text rendering