From 937875c4e1432b418f0f5051759e02c8d4c9ffa4 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Fri, 5 Mar 2021 18:53:06 -0500 Subject: 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. --- src/renderer.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/renderer.cpp') 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) { SDL_RenderCopy(ren_.get(), mapSwapTex_.get(), nullptr, nullptr); } + // Render mask sprite layer + if (!game.getMap().getMaskZone().empty()) { + texture_ptr spritesTex( + SDL_CreateTexture( + ren_.get(), + SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, + mapBounds.w(), + mapBounds.h())); + + if (!spritesTex) { + throw sdl_error(); + } + + SDL_SetRenderTarget(ren_.get(), spritesTex.get()); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); + SDL_RenderClear(ren_.get()); + + for (const Sprite& sprite : game.getSystem().getSpritesByY(SpriteLayer::Mask) | game.spriteView()) { + renderSprite(sprite); + } + + const Zone& zone = game.getMap().getZone(game.getMap().getMaskZone()); + SDL_Rect zoneArea { zone.ul.x(), zone.ul.y(), zone.dr.x() - zone.ul.x(), zone.dr.y() - zone.ul.y() }; + + SDL_SetRenderTarget(ren_.get(), canvas.get()); + SDL_SetTextureBlendMode(spritesTex.get(), SDL_BLENDMODE_BLEND); + SDL_RenderCopy(ren_.get(), spritesTex.get(), &zoneArea, &zoneArea); + } + // Render normal sprite layer for (const Sprite& sprite : game.getSystem().getSpritesByY(SpriteLayer::Normal) | game.spriteView()) { renderSprite(sprite); -- cgit 1.4.1