#pragma once #include #include // Para size_t #include // Para shared_ptr, __shared_ptr_access #include // Para string #include // Para vector #include "utils.h" // Para Color #include "options.h" struct Surface; class Screen { private: // Constantes static constexpr int WINDOWS_DECORATIONS_ = 35; // [SINGLETON] Objeto privado 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_texture_; // Textura donde se dibuja el juego std::shared_ptr game_surface_; // Surface principal para manejar game_surface_data_ std::shared_ptr> renderer_surface_; // Puntero a la Surface que actua // Variables int window_width_; // Ancho de la pantalla o ventana int window_height_; // Alto de la pantalla o ventana // Arranca SDL VIDEO y crea la ventana bool initSDL(); // Calcula el tamaño de la ventana void adjustWindowSize(); // Copia la surface a la textura void surfaceToTexture(); // Copia la textura al renderizador void textureToRenderer(); // Obtiene información sobre la pantalla void getDisplayInfo(); // Constructor Screen(); // Destructor ~Screen(); public: // [SINGLETON] Crearemos el objeto con esta función estática static void init(); // [SINGLETON] Destruiremos el objeto con esta función estática static void destroy(); // [SINGLETON] Con este método obtenemos el objeto y podemos trabajar con él static Screen *get(); // Limpia el renderer void clearRenderer(Color color = {0x00, 0x00, 0x00}); // Limpia la game_surface_ void clearSurface(Uint8 index); // Prepara para empezar a dibujar en la textura de juego void start(); // Vuelca el contenido del renderizador en pantalla void render(); // Actualiza la lógica de la clase void update(); // Establece el modo de video void setFullscreenMode(bool mode = options.video.fullscreen); // Cambia entre pantalla completa y ventana void toggleFullscreen(); // Reduce el tamaño de la ventana bool decWindowZoom(); // Aumenta el tamaño de la ventana bool incWindowZoom(); // Muestra la ventana void show(); // Oculta la ventana void hide(); // Establece el renderizador para las surfaces void setRendererSurface(std::shared_ptr surface = nullptr); // Getters SDL_Renderer *getRenderer(); std::shared_ptr getRendererSurface(); };