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"); system("sudo shutdown -h +0.1");
#elif __linux__ #elif __linux__
// Apaga el sistema en Linux // Apaga el sistema en Linux
system("shutdown -h +0.1"); system("sleep 5; shutdown -h now");
#else #else
// Sistema operativo no compatible // Sistema operativo no compatible
#error "Sistema operativo no soportado" #error "Sistema operativo no soportado"

View File

@@ -78,6 +78,7 @@ void Screen::clean(Color color)
void Screen::start() void Screen::start()
{ {
SDL_SetRenderTarget(renderer_, game_canvas_); SDL_SetRenderTarget(renderer_, game_canvas_);
clean();
} }
// Vuelca el contenido del renderizador en pantalla // Vuelca el contenido del renderizador en pantalla
@@ -89,23 +90,25 @@ void Screen::render()
// Dibuja efectos y elementos sobre el game_canvas_ // Dibuja efectos y elementos sobre el game_canvas_
renderFlash(); renderFlash();
renderAttenuate(); renderAttenuate();
renderShake();
OnScreenHelp::get()->render(); OnScreenHelp::get()->render();
renderInfo(); renderInfo();
Notifier::get()->render(); Notifier::get()->render();
// Restablece el objetivo de renderizado al buffer de pantalla predeterminado // Renderiza el contenido del game_canvas_
SDL_SetRenderTarget(renderer_, nullptr);
// Renderiza el contenido del game_canvas_ o aplica shaders según configuración
renderScreen(); 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() void Screen::renderScreen()
{ {
// Restablece el objetivo de renderizado al buffer de pantalla predeterminado
SDL_SetRenderTarget(renderer_, nullptr);
#ifdef NO_SHADERS #ifdef NO_SHADERS
// Actualiza la pantalla con el contenido del game_canvas_ // Actualiza la pantalla con el contenido del buffer de renderizado
presentGameCanvas(); SDL_RenderCopy(renderer_, game_canvas_, nullptr, nullptr);
SDL_RenderPresent(renderer_);
#else #else
if (options.video.shaders) if (options.video.shaders)
{ {
@@ -114,8 +117,9 @@ void Screen::renderScreen()
} }
else else
{ {
// Actualiza la pantalla con el contenido del game_canvas_ // Actualiza la pantalla con el contenido del buffer de renderizado
presentGameCanvas(); SDL_RenderCopy(renderer_, game_canvas_, nullptr, nullptr);
SDL_RenderPresent(renderer_);
} }
#endif #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 // Activa / desactiva los shaders
void Screen::toggleShaders() void Screen::toggleShaders()
{ {
@@ -405,18 +436,3 @@ SDL_Point Screen::getNewPosition()
return new_pos; 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 // Atenua la pantalla
void renderAttenuate(); void renderAttenuate();
// Aplica el efecto de agitar la pantalla
void renderShake();
// Calcula los frames por segundo // Calcula los frames por segundo
void updateFPS(); void updateFPS();