diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-03-05 18:53:06 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-03-05 18:53:06 -0500 |
commit | 937875c4e1432b418f0f5051759e02c8d4c9ffa4 (patch) | |
tree | bfb08ae9f8e4619dc213e20739b4fbce682ae0d0 /src | |
parent | cd72ba5481705072b893d728e2f80931b5cca580 (diff) | |
download | tanetane-937875c4e1432b418f0f5051759e02c8d4c9ffa4.tar.gz tanetane-937875c4e1432b418f0f5051759e02c8d4c9ffa4.tar.bz2 tanetane-937875c4e1432b418f0f5051759e02c8d4c9ffa4.zip |
Added the mask sprite layer
This layer is below the normal sprite layer. Sprites on it are only rendered within the area of a zone that is defined per-map.
Diffstat (limited to 'src')
-rw-r--r-- | src/consts.h | 2 | ||||
-rw-r--r-- | src/game.cpp | 2 | ||||
-rw-r--r-- | src/map.cpp | 10 | ||||
-rw-r--r-- | src/map.h | 4 | ||||
-rw-r--r-- | src/renderer.cpp | 30 | ||||
-rw-r--r-- | src/sprite.h | 4 | ||||
-rw-r--r-- | src/transform_system.h | 2 |
7 files changed, 49 insertions, 5 deletions
diff --git a/src/consts.h b/src/consts.h index e0af6cd..65e4558 100644 --- a/src/consts.h +++ b/src/consts.h | |||
@@ -12,6 +12,4 @@ const int PARTY_FRAME_DELAY = 20; // true delay is this divided by movement spee | |||
12 | 12 | ||
13 | const int MESSAGE_TEXT_WIDTH = 196; | 13 | const int MESSAGE_TEXT_WIDTH = 196; |
14 | 14 | ||
15 | const int NUM_SPRITE_LAYERS = 2; | ||
16 | |||
17 | #endif /* end of include guard: CONSTS_H_9561E49C */ | 15 | #endif /* end of include guard: CONSTS_H_9561E49C */ |
diff --git a/src/game.cpp b/src/game.cpp index 5b5c506..7e3c88f 100644 --- a/src/game.cpp +++ b/src/game.cpp | |||
@@ -56,7 +56,7 @@ void Game::loadMap(std::string filename) { | |||
56 | if (spritesByAlias_.count(p.name)) continue; | 56 | if (spritesByAlias_.count(p.name)) continue; |
57 | 57 | ||
58 | int spriteId = emplaceSprite(p.name); | 58 | int spriteId = emplaceSprite(p.name); |
59 | getSystem<TransformSystem>().initSprite(spriteId, p.pos); | 59 | getSystem<TransformSystem>().initSprite(spriteId, p.pos, p.masked ? SpriteLayer::Mask : SpriteLayer::Normal); |
60 | getSystem<TransformSystem>().setUpCollision(spriteId, p.collisionOffset, p.collisionSize, true); | 60 | getSystem<TransformSystem>().setUpCollision(spriteId, p.collisionOffset, p.collisionSize, true); |
61 | if (!p.animationFilename.empty()) { | 61 | if (!p.animationFilename.empty()) { |
62 | getSystem<AnimationSystem>().initSprite(spriteId, p.animationFilename); | 62 | getSystem<AnimationSystem>().initSprite(spriteId, p.animationFilename); |
diff --git a/src/map.cpp b/src/map.cpp index c3ac828..8d0ada6 100644 --- a/src/map.cpp +++ b/src/map.cpp | |||
@@ -71,12 +71,20 @@ Map::Map(std::string_view name) : name_(name) { | |||
71 | } else if (layer->getType() == tmx::Layer::Type::Object) { | 71 | } else if (layer->getType() == tmx::Layer::Type::Object) { |
72 | const auto& objectLayer = layer->getLayerAs<tmx::ObjectGroup>(); | 72 | const auto& objectLayer = layer->getLayerAs<tmx::ObjectGroup>(); |
73 | 73 | ||
74 | bool masked = false; | ||
75 | for (const tmx::Property& property : objectLayer.getProperties()) { | ||
76 | if (property.getName() == "masked" && property.getBoolValue()) { | ||
77 | masked = true; | ||
78 | } | ||
79 | } | ||
80 | |||
74 | for (const tmx::Object& object : objectLayer.getObjects()) { | 81 | for (const tmx::Object& object : objectLayer.getObjects()) { |
75 | if (object.getType() == "sprite") { | 82 | if (object.getType() == "sprite") { |
76 | Prototype p; | 83 | Prototype p; |
77 | p.name = object.getName(); | 84 | p.name = object.getName(); |
78 | p.pos.x() = object.getPosition().x; | 85 | p.pos.x() = object.getPosition().x; |
79 | p.pos.y() = object.getPosition().y; | 86 | p.pos.y() = object.getPosition().y; |
87 | p.masked = masked; | ||
80 | 88 | ||
81 | for (const tmx::Property& property : object.getProperties()) { | 89 | for (const tmx::Property& property : object.getProperties()) { |
82 | if (property.getName() == "collisionOffsetX") { | 90 | if (property.getName() == "collisionOffsetX") { |
@@ -159,6 +167,8 @@ Map::Map(std::string_view name) : name_(name) { | |||
159 | for (const tmx::Property& property : mapfile.getProperties()) { | 167 | for (const tmx::Property& property : mapfile.getProperties()) { |
160 | if (property.getName() == "music") { | 168 | if (property.getName() == "music") { |
161 | music_ = property.getStringValue(); | 169 | music_ = property.getStringValue(); |
170 | } else if (property.getName() == "maskZone") { | ||
171 | maskZone_ = property.getStringValue(); | ||
162 | } | 172 | } |
163 | } | 173 | } |
164 | } | 174 | } |
diff --git a/src/map.h b/src/map.h index a125082..1167290 100644 --- a/src/map.h +++ b/src/map.h | |||
@@ -31,6 +31,7 @@ struct Prototype { | |||
31 | bool wander = false; | 31 | bool wander = false; |
32 | int movementSpeed = -1; | 32 | int movementSpeed = -1; |
33 | std::string enclosureZone; | 33 | std::string enclosureZone; |
34 | bool masked = false; | ||
34 | }; | 35 | }; |
35 | 36 | ||
36 | struct Trigger { | 37 | struct Trigger { |
@@ -82,6 +83,8 @@ public: | |||
82 | 83 | ||
83 | const std::string& getMusic() const { return music_; } | 84 | const std::string& getMusic() const { return music_; } |
84 | 85 | ||
86 | const std::string& getMaskZone() const { return maskZone_; } | ||
87 | |||
85 | private: | 88 | private: |
86 | 89 | ||
87 | std::string name_; | 90 | std::string name_; |
@@ -96,6 +99,7 @@ private: | |||
96 | std::vector<Trigger> triggers_; | 99 | std::vector<Trigger> triggers_; |
97 | std::map<std::string, Zone> zones_; | 100 | std::map<std::string, Zone> zones_; |
98 | std::string music_; | 101 | std::string music_; |
102 | std::string maskZone_; | ||
99 | }; | 103 | }; |
100 | 104 | ||
101 | #endif /* end of include guard: MAP_H_D95D6D47 */ | 105 | #endif /* end of include guard: MAP_H_D95D6D47 */ |
diff --git a/src/renderer.cpp b/src/renderer.cpp index 5ab623a..ea8a2ac 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp | |||
@@ -178,6 +178,36 @@ void Renderer::render(Game& game) { | |||
178 | SDL_RenderCopy(ren_.get(), mapSwapTex_.get(), nullptr, nullptr); | 178 | SDL_RenderCopy(ren_.get(), mapSwapTex_.get(), nullptr, nullptr); |
179 | } | 179 | } |
180 | 180 | ||
181 | // Render mask sprite layer | ||
182 | if (!game.getMap().getMaskZone().empty()) { | ||
183 | texture_ptr spritesTex( | ||
184 | SDL_CreateTexture( | ||
185 | ren_.get(), | ||
186 | SDL_PIXELFORMAT_RGBA8888, | ||
187 | SDL_TEXTUREACCESS_TARGET, | ||
188 | mapBounds.w(), | ||
189 | mapBounds.h())); | ||
190 | |||
191 | if (!spritesTex) { | ||
192 | throw sdl_error(); | ||
193 | } | ||
194 | |||
195 | SDL_SetRenderTarget(ren_.get(), spritesTex.get()); | ||
196 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); | ||
197 | SDL_RenderClear(ren_.get()); | ||
198 | |||
199 | for (const Sprite& sprite : game.getSystem<TransformSystem>().getSpritesByY(SpriteLayer::Mask) | game.spriteView()) { | ||
200 | renderSprite(sprite); | ||
201 | } | ||
202 | |||
203 | const Zone& zone = game.getMap().getZone(game.getMap().getMaskZone()); | ||
204 | SDL_Rect zoneArea { zone.ul.x(), zone.ul.y(), zone.dr.x() - zone.ul.x(), zone.dr.y() - zone.ul.y() }; | ||
205 | |||
206 | SDL_SetRenderTarget(ren_.get(), canvas.get()); | ||
207 | SDL_SetTextureBlendMode(spritesTex.get(), SDL_BLENDMODE_BLEND); | ||
208 | SDL_RenderCopy(ren_.get(), spritesTex.get(), &zoneArea, &zoneArea); | ||
209 | } | ||
210 | |||
181 | // Render normal sprite layer | 211 | // Render normal sprite layer |
182 | for (const Sprite& sprite : game.getSystem<TransformSystem>().getSpritesByY(SpriteLayer::Normal) | game.spriteView()) { | 212 | for (const Sprite& sprite : game.getSystem<TransformSystem>().getSpritesByY(SpriteLayer::Normal) | game.spriteView()) { |
183 | renderSprite(sprite); | 213 | renderSprite(sprite); |
diff --git a/src/sprite.h b/src/sprite.h index 13d0383..6538c1d 100644 --- a/src/sprite.h +++ b/src/sprite.h | |||
@@ -11,8 +11,10 @@ | |||
11 | #include "step_type.h" | 11 | #include "step_type.h" |
12 | 12 | ||
13 | enum class SpriteLayer { | 13 | enum class SpriteLayer { |
14 | Mask, | ||
14 | Normal, | 15 | Normal, |
15 | Above | 16 | Above, |
17 | NUM_SPRITE_LAYERS // do not use | ||
16 | }; | 18 | }; |
17 | 19 | ||
18 | struct SpriteFrame { | 20 | struct SpriteFrame { |
diff --git a/src/transform_system.h b/src/transform_system.h index 6707347..7fa3423 100644 --- a/src/transform_system.h +++ b/src/transform_system.h | |||
@@ -54,7 +54,7 @@ public: | |||
54 | private: | 54 | private: |
55 | 55 | ||
56 | Game& game_; | 56 | Game& game_; |
57 | std::set<std::tuple<int, int>> spritesByY_[NUM_SPRITE_LAYERS]; | 57 | std::set<std::tuple<int, int>> spritesByY_[static_cast<int>(SpriteLayer::NUM_SPRITE_LAYERS)]; |
58 | 58 | ||
59 | struct Collidable { | 59 | struct Collidable { |
60 | int lower; | 60 | int lower; |