From 764efea5a38b970fa57d8c0197673276023b58aa Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 13 Mar 2021 07:45:55 -0500 Subject: Added pause menu opening and closing animation #7 --- src/input_system.cpp | 29 +++++++++++++++++------------ src/menu_system.cpp | 26 ++++++++++++++++++++++++++ src/menu_system.h | 23 +++++++++++++++++++++++ src/renderer.cpp | 20 ++++++++++++++++++++ 4 files changed, 86 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/input_system.cpp b/src/input_system.cpp index c399e91..fd7889d 100644 --- a/src/input_system.cpp +++ b/src/input_system.cpp @@ -5,6 +5,7 @@ #include "script_system.h" #include "transform_system.h" #include "animation_system.h" +#include "menu_system.h" struct Input { bool left = false; @@ -16,25 +17,29 @@ struct Input { void InputSystem::tick(double dt) { SDL_Event e; while (SDL_PollEvent(&e)) { - if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE) { - if (debugConsole_) { - debugConsole_ = false; - game_.unpauseGameplay(); - SDL_StopTextInput(); - debugText_.clear(); - } else { - game_.quit(); - } - } else if (e.type == SDL_QUIT) { + if (e.type == SDL_QUIT) { game_.quit(); return; } else if (e.type == SDL_TEXTINPUT) { debugText_.append(e.text.text); } else if (e.type == SDL_KEYDOWN) { - if (e.key.keysym.sym == SDLK_BACKQUOTE) { + if (e.key.keysym.sym == SDLK_ESCAPE) { + if (debugConsole_) { + debugConsole_ = false; + game_.unpauseGameplay(); + SDL_StopTextInput(); + debugText_.clear(); + } else { + if (game_.getSystem().isMenuOpen()) { + game_.getSystem().closePauseMenu(); + } else if (!game_.isGameplayPaused()) { + game_.getSystem().openPauseMenu(); + } + } + } else if (e.key.keysym.sym == SDLK_BACKQUOTE) { #ifdef TANETANE_DEBUG - if (!debugConsole_) { + if (!debugConsole_ && !game_.isGameplayPaused()) { debugConsole_ = true; game_.pauseGameplay(); SDL_StartTextInput(); diff --git a/src/menu_system.cpp b/src/menu_system.cpp index a5f3539..7c7d162 100644 --- a/src/menu_system.cpp +++ b/src/menu_system.cpp @@ -1,2 +1,28 @@ #include "menu_system.h" #include "game.h" + +void MenuSystem::tick(double dt) { + pauseAnimation_.tick(dt); + + if (openState_ == OpenState::Animating && pauseAnimation_.isComplete()) { + if (pauseAnimation_.getProgress() == 0.0) { + openState_ = OpenState::Closed; + + game_.unpauseGameplay(); + } else if (pauseAnimation_.getProgress() == 1.0) { + openState_ = OpenState::Open; + } + } +} + +void MenuSystem::openPauseMenu() { + pauseAnimation_.start(125, 1.0); + openState_ = OpenState::Animating; + + game_.pauseGameplay(); +} + +void MenuSystem::closePauseMenu() { + pauseAnimation_.start(125, 0.0); + openState_ = OpenState::Animating; +} diff --git a/src/menu_system.h b/src/menu_system.h index 46963b2..ded57b5 100644 --- a/src/menu_system.h +++ b/src/menu_system.h @@ -2,6 +2,7 @@ #define MENU_SYSTEM_H_205861EC #include "system.h" +#include "interpolation.h" class Game; @@ -12,9 +13,31 @@ public: explicit MenuSystem(Game& game) : game_(game) {} + void tick(double dt) override; + + // Commands + + void openPauseMenu(); + + void closePauseMenu(); + + // Info + + double getPauseAnimationProgress() const { return pauseAnimation_.getProgress(); } + + bool isMenuOpen() const { return openState_ == OpenState::Open; } + private: + enum class OpenState { + Closed, + Animating, + Open + }; + Game& game_; + Interpolation pauseAnimation_; + OpenState openState_ = OpenState::Closed; }; #endif /* end of include guard: MENU_SYSTEM_H_205861EC */ diff --git a/src/renderer.cpp b/src/renderer.cpp index ea8a2ac..314dd4f 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -8,6 +8,7 @@ #include "message_system.h" #include "effect_system.h" #include "input_system.h" +#include "menu_system.h" Renderer::Renderer() { win_ = window_ptr( @@ -124,6 +125,7 @@ void Renderer::renderSprite(const Sprite& sprite) { void Renderer::render(Game& game) { auto& effects = game.getSystem(); + auto& menus = game.getSystem(); if (cachedMapName_ != game.getMap().getName()) { cachedMapName_ = game.getMap().getName(); @@ -493,6 +495,24 @@ void Renderer::render(Game& game) { } } + if (menus.isMenuOpen()) { + SDL_SetRenderTarget(ren_.get(), cameraTex.get()); + SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); + SDL_RenderFillRect(ren_.get(), nullptr); + } else if (menus.getPauseAnimationProgress() > 0.0) { + SDL_SetRenderTarget(ren_.get(), cameraTex.get()); + SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); + + int barHeight = CANVAS_HEIGHT / 2 * menus.getPauseAnimationProgress(); + SDL_Rect topHalf { 0, 0, CANVAS_WIDTH, barHeight }; + SDL_Rect bottomHalf { 0, CANVAS_HEIGHT - barHeight, CANVAS_WIDTH, barHeight }; + + SDL_RenderFillRect(ren_.get(), &topHalf); + SDL_RenderFillRect(ren_.get(), &bottomHalf); + } + SDL_SetRenderTarget(ren_.get(), nullptr); SDL_RenderCopy(ren_.get(), cameraTex.get(), nullptr, nullptr); SDL_RenderPresent(ren_.get()); -- cgit 1.4.1