Añadido efecto de atenuación a la clase screen

Al pausar el juego se atenua la pantalla
This commit is contained in:
2024-06-30 15:27:06 +02:00
parent addc8241ab
commit 8340bdfe32
4 changed files with 44 additions and 4 deletions

View File

@@ -36,6 +36,7 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options
shakeEffect.lenght = 8; shakeEffect.lenght = 8;
shakeEffect.remaining = 0; shakeEffect.remaining = 0;
shakeEffect.origin = 0; shakeEffect.origin = 0;
attenuateEffect = false;
iniFade(); iniFade();
@@ -74,6 +75,9 @@ void Screen::blit()
// Actualiza y dibuja el efecto de flash en la pantalla // Actualiza y dibuja el efecto de flash en la pantalla
doFlash(); doFlash();
// Atenua la pantalla
doAttenuate();
if (options->video.shaders) if (options->video.shaders)
{ {
shader::render(); 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 // Activa/desactiva los shaders
void Screen::switchShaders() void Screen::switchShaders()
{ {
options->video.shaders = !options->video.shaders; options->video.shaders = !options->video.shaders;
setVideoMode(options->video.mode); setVideoMode(options->video.mode);
} }
// Atenua la pantalla
void Screen::attenuate(bool value)
{
attenuateEffect = value;
}

View File

@@ -31,6 +31,7 @@ private:
int borderHeight; // Anltura del borde int borderHeight; // Anltura del borde
SDL_Rect dest; // Coordenadas donde se va a dibujar la textura del juego sobre la pantalla o ventana 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 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 struct effect_t
{ {
@@ -75,6 +76,9 @@ private:
// Actualiza y dibuja el efecto de flash en la pantalla // Actualiza y dibuja el efecto de flash en la pantalla
void doFlash(); void doFlash();
// Atenua la pantalla
void doAttenuate();
public: public:
// Constructor // Constructor
Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options_t *options); Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options_t *options);
@@ -139,6 +143,9 @@ public:
// Activa/desactiva los shaders // Activa/desactiva los shaders
void switchShaders(); void switchShaders();
// Atenua la pantalla
void attenuate(bool value);
}; };
#endif #endif

View File

@@ -2744,7 +2744,7 @@ void Game::checkGameInput()
else if (input->checkInput(input_pause, REPEAT_FALSE)) else if (input->checkInput(input_pause, REPEAT_FALSE))
{ {
paused = !paused; pause(!paused);
} }
else if (input->checkInput(input_window_fullscreen, REPEAT_FALSE)) else if (input->checkInput(input_window_fullscreen, REPEAT_FALSE))
@@ -3241,12 +3241,12 @@ void Game::checkEvents()
{ {
if (eventHandler->window.event == SDL_WINDOWEVENT_FOCUS_LOST) if (eventHandler->window.event == SDL_WINDOWEVENT_FOCUS_LOST)
{ {
paused = true; pause(true);
} }
if (eventHandler->window.event == SDL_WINDOWEVENT_FOCUS_GAINED) if (eventHandler->window.event == SDL_WINDOWEVENT_FOCUS_GAINED)
{ {
paused = false; pause(false);
} }
} }
} }
@@ -3353,3 +3353,10 @@ void Game::updateScoreboard()
scoreboard->setHiScore(hiScore); scoreboard->setHiScore(hiScore);
scoreboard->setHiScoreName(hiScoreName); scoreboard->setHiScoreName(hiScoreName);
} }
// Pausa el juego
void Game::pause(bool value)
{
paused = value;
screen->attenuate(paused);
}

View File

@@ -468,6 +468,9 @@ private:
// Dibuja los elementos de la zona de juego en su textura // Dibuja los elementos de la zona de juego en su textura
void fillCanvas(); void fillCanvas();
// Pausa el juego
void pause(bool value);
public: public:
// Constructor // 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); 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);