diff --git a/source/common/screen.cpp b/source/common/screen.cpp index 88cab96..4fd4cd7 100644 --- a/source/common/screen.cpp +++ b/source/common/screen.cpp @@ -36,6 +36,7 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options shakeEffect.lenght = 8; shakeEffect.remaining = 0; shakeEffect.origin = 0; + attenuateEffect = false; iniFade(); @@ -74,6 +75,9 @@ void Screen::blit() // Actualiza y dibuja el efecto de flash en la pantalla doFlash(); + // Atenua la pantalla + doAttenuate(); + if (options->video.shaders) { shader::render(); @@ -402,9 +406,28 @@ void Screen::doFlash() } } +// Atenua la pantalla +void Screen::doAttenuate() +{ + if (attenuateEffect) + { + SDL_Texture *temp = SDL_GetRenderTarget(renderer); + SDL_SetRenderTarget(renderer, gameCanvas); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 64); + SDL_RenderFillRect(renderer, nullptr); + SDL_SetRenderTarget(renderer, temp); + } +} + // Activa/desactiva los shaders void Screen::switchShaders() { options->video.shaders = !options->video.shaders; setVideoMode(options->video.mode); +} + +// Atenua la pantalla +void Screen::attenuate(bool value) +{ + attenuateEffect = value; } \ No newline at end of file diff --git a/source/common/screen.h b/source/common/screen.h index 58bfd86..694294a 100644 --- a/source/common/screen.h +++ b/source/common/screen.h @@ -31,6 +31,7 @@ private: int borderHeight; // Anltura del borde SDL_Rect dest; // Coordenadas donde se va a dibujar la textura del juego sobre la pantalla o ventana color_t borderColor; // Color del borde aƱadido a la textura de juego para rellenar la pantalla + bool attenuateEffect; // Indica si la pantalla ha de estar atenuada struct effect_t { @@ -41,7 +42,7 @@ private: }; // Variables - Efectos - effect_t fadeEffect; // Variable para gestionar el efecto de fade + effect_t fadeEffect; // Variable para gestionar el efecto de fade effect_t flashEffect; // Variable para gestionar el efecto de flash struct shake_t @@ -75,6 +76,9 @@ private: // Actualiza y dibuja el efecto de flash en la pantalla void doFlash(); + // Atenua la pantalla + void doAttenuate(); + public: // Constructor Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options_t *options); @@ -139,6 +143,9 @@ public: // Activa/desactiva los shaders void switchShaders(); + + // Atenua la pantalla + void attenuate(bool value); }; #endif diff --git a/source/game.cpp b/source/game.cpp index c58d3f8..c242ab5 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -2744,7 +2744,7 @@ void Game::checkGameInput() else if (input->checkInput(input_pause, REPEAT_FALSE)) { - paused = !paused; + pause(!paused); } else if (input->checkInput(input_window_fullscreen, REPEAT_FALSE)) @@ -3241,12 +3241,12 @@ void Game::checkEvents() { if (eventHandler->window.event == SDL_WINDOWEVENT_FOCUS_LOST) { - paused = true; + pause(true); } if (eventHandler->window.event == SDL_WINDOWEVENT_FOCUS_GAINED) { - paused = false; + pause(false); } } } @@ -3352,4 +3352,11 @@ void Game::updateScoreboard() scoreboard->setPower((float)stage[currentStage].currentPower / (float)stage[currentStage].powerToComplete); scoreboard->setHiScore(hiScore); scoreboard->setHiScoreName(hiScoreName); +} + +// Pausa el juego +void Game::pause(bool value) +{ + paused = value; + screen->attenuate(paused); } \ No newline at end of file diff --git a/source/game.h b/source/game.h index f5c3c41..74533ca 100644 --- a/source/game.h +++ b/source/game.h @@ -468,6 +468,9 @@ private: // Dibuja los elementos de la zona de juego en su textura void fillCanvas(); + // Pausa el juego + void pause(bool value); + public: // Constructor Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang, Input *input, bool demo, param_t *param, options_t *options, section_t *section);