From 40f6f83328a9a84806e72b9ba369616050958fa1 Mon Sep 17 00:00:00 2001 From: Misa Date: Tue, 9 Jan 2024 10:55:00 -0800 Subject: [PATCH] Add border to indicate taking screenshot Originally, I was thinking of adding a notification text that you took a screenshot, but this is better because it is language-agnostic and it doesn't contribute to potential UI clutter/clashing. It flashes yellow if the screenshot successfully saved, and red if it didn't. --- desktop_version/src/Game.cpp | 4 +++ desktop_version/src/Game.h | 4 +++ desktop_version/src/Graphics.cpp | 44 ++++++++++++++++++++++++++++++++ desktop_version/src/Graphics.h | 2 ++ desktop_version/src/KeyPoll.cpp | 5 +++- 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/desktop_version/src/Game.cpp b/desktop_version/src/Game.cpp index 54582aa0..70254b10 100644 --- a/desktop_version/src/Game.cpp +++ b/desktop_version/src/Game.cpp @@ -364,6 +364,10 @@ void Game::init(void) old_mode_indicator_timer = 0; mode_indicator_timer = 0; + old_screenshot_border_timer = 0; + screenshot_border_timer = 0; + screenshot_saved_success = false; + setdefaultcontrollerbuttons(); } diff --git a/desktop_version/src/Game.h b/desktop_version/src/Game.h index 1248d1aa..0a7215c3 100644 --- a/desktop_version/src/Game.h +++ b/desktop_version/src/Game.h @@ -592,6 +592,10 @@ public: int old_mode_indicator_timer; int mode_indicator_timer; + + int old_screenshot_border_timer; + int screenshot_border_timer; + bool screenshot_saved_success; }; #ifndef GAME_DEFINITION diff --git a/desktop_version/src/Graphics.cpp b/desktop_version/src/Graphics.cpp index 48f1be1e..2f65834e 100644 --- a/desktop_version/src/Graphics.cpp +++ b/desktop_version/src/Graphics.cpp @@ -3345,6 +3345,8 @@ void Graphics::screenshake(void) copy_texture(gameTexture, NULL, &shake); + draw_screenshot_border(); + set_render_target(gameTexture); clear(); @@ -3370,6 +3372,8 @@ void Graphics::updatescreenshake(void) void Graphics::render(void) { + draw_screenshot_border(); + if (gameScreen.badSignalEffect) { ApplyFilter(&tempFilterSrc, &tempFilterDest); @@ -3423,6 +3427,46 @@ void Graphics::renderfixedpost(void) { --game.screenshake; } + + game.old_screenshot_border_timer = game.screenshot_border_timer; + if (game.screenshot_border_timer > 0) + { + game.screenshot_border_timer -= 15; + } +} + +void Graphics::draw_screenshot_border(void) +{ + const int border_alpha = lerp(game.old_screenshot_border_timer, game.screenshot_border_timer); + + if (border_alpha <= 100) + { + return; + } + + int width = 0; + int height = 0; + int result = query_texture(gameTexture, NULL, NULL, &width, &height); + if (result != 0) + { + return; + } + + const SDL_Rect rect_inner = {1, 1, width - 2, height - 2}; + + if (game.screenshot_saved_success) + { + set_color(196, 196, 20, border_alpha); + } + else + { + set_color(196, 20, 20, border_alpha); + } + + set_blendmode(SDL_BLENDMODE_BLEND); + draw_rect(NULL); + draw_rect(&rect_inner); + set_blendmode(SDL_BLENDMODE_NONE); } void Graphics::drawtele(int x, int y, int t, const SDL_Color color) diff --git a/desktop_version/src/Graphics.h b/desktop_version/src/Graphics.h index 666b049c..c34ad926 100644 --- a/desktop_version/src/Graphics.h +++ b/desktop_version/src/Graphics.h @@ -252,6 +252,8 @@ public: void renderfixedpre(void); void renderfixedpost(void); + void draw_screenshot_border(void); + bool Hitest(SDL_Surface* surface1, SDL_Point p1, SDL_Surface* surface2, SDL_Point p2); void drawentities(void); diff --git a/desktop_version/src/KeyPoll.cpp b/desktop_version/src/KeyPoll.cpp index 444bad0e..8f2c5bd2 100644 --- a/desktop_version/src/KeyPoll.cpp +++ b/desktop_version/src/KeyPoll.cpp @@ -186,7 +186,10 @@ void KeyPoll::Poll(void) if (evt.key.keysym.sym == SDLK_F6 && !evt.key.repeat) { - SaveScreenshot(); + const bool success = SaveScreenshot(); + game.old_screenshot_border_timer = 255; + game.screenshot_border_timer = 255; + game.screenshot_saved_success = success; } BUTTONGLYPHS_keyboard_set_active(true);