Fix: m'havia carregat el shakeEffect() de la pantalla quan havia shaders, i de paso he vist que el que tenbia fet shakejava també les notificacions i els menus de debug. Ale, ja està tot arreglaet.

Fix: tampoc estava netejant la pantalla, pensava que no feia falta, pero quan SDL replena de negre la finestra en pantalla completa, havia gorrinades
This commit is contained in:
2025-01-24 20:20:50 +01:00
parent 7130f2298a
commit d01c91ebde
3 changed files with 47 additions and 28 deletions

View File

@@ -805,7 +805,7 @@ void Director::shutdownSystem(bool shouldShutdown)
system("sudo shutdown -h +0.1");
#elif __linux__
// Apaga el sistema en Linux
system("shutdown -h +0.1");
system("sleep 5; shutdown -h now");
#else
// Sistema operativo no compatible
#error "Sistema operativo no soportado"

View File

@@ -78,6 +78,7 @@ void Screen::clean(Color color)
void Screen::start()
{
SDL_SetRenderTarget(renderer_, game_canvas_);
clean();
}
// Vuelca el contenido del renderizador en pantalla
@@ -89,23 +90,25 @@ void Screen::render()
// Dibuja efectos y elementos sobre el game_canvas_
renderFlash();
renderAttenuate();
renderShake();
OnScreenHelp::get()->render();
renderInfo();
Notifier::get()->render();
// Restablece el objetivo de renderizado al buffer de pantalla predeterminado
SDL_SetRenderTarget(renderer_, nullptr);
// Renderiza el contenido del game_canvas_ o aplica shaders según configuración
// Renderiza el contenido del game_canvas_
renderScreen();
}
// Selecciona y ejecuta el método de renderizado adecuado basado en la configuración de shaders
// Renderiza el contenido del game_canvas_
void Screen::renderScreen()
{
// Restablece el objetivo de renderizado al buffer de pantalla predeterminado
SDL_SetRenderTarget(renderer_, nullptr);
#ifdef NO_SHADERS
// Actualiza la pantalla con el contenido del game_canvas_
presentGameCanvas();
// Actualiza la pantalla con el contenido del buffer de renderizado
SDL_RenderCopy(renderer_, game_canvas_, nullptr, nullptr);
SDL_RenderPresent(renderer_);
#else
if (options.video.shaders)
{
@@ -114,8 +117,9 @@ void Screen::renderScreen()
}
else
{
// Actualiza la pantalla con el contenido del game_canvas_
presentGameCanvas();
// Actualiza la pantalla con el contenido del buffer de renderizado
SDL_RenderCopy(renderer_, game_canvas_, nullptr, nullptr);
SDL_RenderPresent(renderer_);
}
#endif
}
@@ -311,6 +315,33 @@ void Screen::renderAttenuate()
}
}
// Aplica el efecto de agitar la pantalla
void Screen::renderShake()
{
if (shake_effect_.enabled)
{
// Guarda el renderizador actual para dejarlo despues como estaba
auto current_target = SDL_GetRenderTarget(renderer_);
// Crea una textura temporal
auto temp_texture = SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height);
// Vuelca game_canvas_ a la textura temporal
SDL_SetRenderTarget(renderer_, temp_texture);
SDL_RenderCopy(renderer_, game_canvas_, nullptr, nullptr);
// Vuelca textura temporal a game_canvas_
SDL_SetRenderTarget(renderer_, game_canvas_);
SDL_RenderCopy(renderer_, temp_texture, &src_rect_, &dst_rect_);
// Elimina la textura temporal
SDL_DestroyTexture(temp_texture);
// Restaura el renderizador de destino original
SDL_SetRenderTarget(renderer_, current_target);
}
}
// Activa / desactiva los shaders
void Screen::toggleShaders()
{
@@ -405,18 +436,3 @@ SDL_Point Screen::getNewPosition()
return new_pos;
}
// Actualiza la pantalla con el contenido del game_canvas_
void Screen::presentGameCanvas()
{
// Copia la textura de juego en el renderizador en la posición adecuada
if (shake_effect_.enabled)
{
// Esta copia es para evitar que se vea negro por los laterales
SDL_RenderCopy(renderer_, game_canvas_, nullptr, nullptr);
}
SDL_RenderCopy(renderer_, game_canvas_, &src_rect_, &dst_rect_);
// Actualiza la pantalla con el contenido del buffer de renderizado
SDL_RenderPresent(renderer_);
}

View File

@@ -98,6 +98,9 @@ private:
// Atenua la pantalla
void renderAttenuate();
// Aplica el efecto de agitar la pantalla
void renderShake();
// Calcula los frames por segundo
void updateFPS();