From ce0628c5ad96e094db12a67d4e98b445fa873ad3 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sun, 14 Feb 2021 16:13:08 -0500 Subject: Added map fadeouts Screen fadeouts and map fadeouts are now handled by the effect system. --- src/renderer.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) (limited to 'src/renderer.cpp') diff --git a/src/renderer.cpp b/src/renderer.cpp index 0e5f8f1..c80b0d3 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -6,6 +6,7 @@ #include "transform_system.h" #include "camera_system.h" #include "message_system.h" +#include "effect_system.h" Renderer::Renderer() { win_ = window_ptr( @@ -110,10 +111,22 @@ void Renderer::renderSprite(const Sprite& sprite) { } void Renderer::render(Game& game) { + auto& effects = game.getSystem(); + if (cachedMapName_ != game.getMap().getName()) { cachedMapName_ = game.getMap().getName(); renLay1_ = renderMapLayer(game.getMap(), 0); renLay0_ = renderMapLayer(game.getMap(), 1); + + vec2i mapBounds = game.getMap().getMapSize() * game.getMap().getTileSize(); + mapSwapTex_.reset(SDL_CreateTexture( + ren_.get(), + SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, + mapBounds.w(), + mapBounds.h())); + + SDL_SetTextureBlendMode(mapSwapTex_.get(), SDL_BLENDMODE_BLEND); } vec2i mapBounds = game.getMap().getMapSize() * game.getMap().getTileSize(); @@ -135,14 +148,48 @@ void Renderer::render(Game& game) { SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255); SDL_RenderClear(ren_.get()); + // Render lower map layer SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, nullptr); + if (effects.isMapFaded()) { + SDL_SetRenderTarget(ren_.get(), mapSwapTex_.get()); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); + SDL_RenderClear(ren_.get()); + SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, nullptr); + + SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_MOD); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); + SDL_RenderFillRect(ren_.get(), nullptr); + + SDL_SetRenderTarget(ren_.get(), canvas.get()); + SDL_SetTextureAlphaMod(mapSwapTex_.get(), effects.getMapFadeProgress() * 255); + SDL_RenderCopy(ren_.get(), mapSwapTex_.get(), nullptr, nullptr); + } + + // Render normal sprite layer for (const Sprite& sprite : game.getSystem().getSpritesByY(SpriteLayer::Normal) | game.spriteView()) { renderSprite(sprite); } + // Render upper map layer SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, nullptr); + if (effects.isMapFaded()) { + SDL_SetRenderTarget(ren_.get(), mapSwapTex_.get()); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); + SDL_RenderClear(ren_.get()); + SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, nullptr); + + SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_MOD); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); + SDL_RenderFillRect(ren_.get(), nullptr); + + SDL_SetRenderTarget(ren_.get(), canvas.get()); + SDL_SetTextureAlphaMod(mapSwapTex_.get(), effects.getMapFadeProgress() * 255); + SDL_RenderCopy(ren_.get(), mapSwapTex_.get(), nullptr, nullptr); + } + + // Render above sprite layer for (const Sprite& sprite : game.getSystem().getSpritesByY(SpriteLayer::Above) | game.spriteView()) { renderSprite(sprite); } @@ -170,6 +217,7 @@ void Renderer::render(Game& game) { SDL_RenderCopy(ren_.get(), canvas.get(), &cameraField, nullptr); if (game.getSystem().getCutsceneBarsProgress() > 0) { + SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); int topBarHeight = 16.0 * game.getSystem().getCutsceneBarsProgress(); @@ -277,9 +325,9 @@ void Renderer::render(Game& game) { } } - if (game.getFadeoutProgress() > 0.0) { + if (effects.isScreenFaded()) { SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_BLEND); - SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, game.getFadeoutProgress() * 255); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, effects.getScreenFadeProgress() * 255); SDL_RenderFillRect(ren_.get(), nullptr); } -- cgit 1.4.1