diff --git a/source/director.cpp b/source/director.cpp index f3f2498..79ae1cf 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -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" diff --git a/source/screen.cpp b/source/screen.cpp index 5847d57..84b1f45 100644 --- a/source/screen.cpp +++ b/source/screen.cpp @@ -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() { @@ -404,19 +435,4 @@ SDL_Point Screen::getNewPosition() new_pos.y = std::clamp(new_pos.y, 30, DM.h - new_height); 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_); } \ No newline at end of file diff --git a/source/screen.h b/source/screen.h index 2166e51..19fc15e 100644 --- a/source/screen.h +++ b/source/screen.h @@ -28,9 +28,9 @@ private: static Screen *screen_; // Objetos y punteros - SDL_Window *window_; // Ventana de la aplicación - SDL_Renderer *renderer_; // El renderizador de la ventana - SDL_Texture *game_canvas_; // Textura donde se dibuja todo antes de volcarse al renderizador + SDL_Window *window_; // Ventana de la aplicación + SDL_Renderer *renderer_; // El renderizador de la ventana + SDL_Texture *game_canvas_; // Textura donde se dibuja todo antes de volcarse al renderizador // Variables SDL_Rect src_rect_; // Coordenadas de donde va a pillar la textura del juego para dibujarla @@ -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();