#pragma once #include // Para SDL_FRect, SDL_FPoint, SDL_Texture, SDL_Renderer #include // Para array #include // Para size_t #include // Para function #include // Para unique_ptr, shared_ptr #include // Para vector #include "color.h" // Para Color class MovingSprite; class Sprite; class Texture; // --- Clase Background: gestiona el fondo de la sección jugable --- class Background { public: // --- Enums --- enum class State { NORMAL, // Progresión normal del día COMPLETED // Reducción gradual de la actividad }; // --- Tipos --- using ProgressCallback = std::function; // Callback para sincronización // --- Constructor y destructor --- Background(float total_progress_to_complete = 6100.0F); // Constructor principal ~Background(); // Destructor // --- Métodos principales --- void update(); // Actualiza la lógica del objeto void render(); // Dibuja el objeto void reset(); // Reinicia la progresión // --- Configuración --- void setPos(SDL_FRect pos); // Establece la posición del objeto void setState(State new_state); // Cambia el estado del fondo void setProgressCallback(ProgressCallback callback); // Establece callback para sincronización void removeProgressCallback(); // Elimina el callback void setManualMode(bool manual); // Activa/desactiva el modo manual void setCloudsSpeed(float value); // Ajusta la velocidad de las nubes void setGradientNumber(int value); // Establece el degradado de fondo void setTransition(float value); // Ajusta la transición entre texturas void setSunProgression(float progress); // Establece la posición del sol void setMoonProgression(float progress); // Establece la posición de la luna void setColor(Color color); // Establece el color de atenuación void setAlpha(int alpha); // Ajusta la transparencia del fondo // --- Control de progresión --- void incrementProgress(float amount = 1.0F); // Incrementa la progresión interna void setProgress(float absolute_progress); // Establece la progresión absoluta // --- Getters --- [[nodiscard]] auto getProgress() const -> float { return progress_; } // Obtiene el progreso actual [[nodiscard]] auto getState() const -> State { return state_; } // Obtiene el estado actual [[nodiscard]] auto getCurrentGradient() const -> int { return static_cast(gradient_number_); } // Obtiene el gradiente actual private: // --- Constantes --- static constexpr size_t STAGES = 4; // Número de etapas static constexpr float COMPLETED_REDUCTION_RATE = 25.0F; // Tasa de reducción completada static constexpr float MINIMUM_COMPLETED_PROGRESS = 200.0F; // Progreso mínimo completado static constexpr float SUN_COMPLETION_FACTOR = 0.5F; // Factor de completado del sol // --- Objetos y punteros --- SDL_Renderer *renderer_; // Renderizador de la ventana SDL_Texture *canvas_; // Textura para componer el fondo SDL_Texture *color_texture_; // Textura para atenuar el fondo std::shared_ptr buildings_texture_; // Textura de edificios std::shared_ptr top_clouds_texture_; // Textura de nubes superiores std::shared_ptr bottom_clouds_texture_; // Textura de nubes inferiores std::shared_ptr grass_texture_; // Textura de hierba std::shared_ptr gradients_texture_; // Textura de gradientes std::shared_ptr sun_texture_; // Textura del sol std::shared_ptr moon_texture_; // Textura de la luna std::unique_ptr top_clouds_sprite_a_; // Sprite de nubes superiores A std::unique_ptr top_clouds_sprite_b_; // Sprite de nubes superiores B std::unique_ptr bottom_clouds_sprite_a_; // Sprite de nubes inferiores A std::unique_ptr bottom_clouds_sprite_b_; // Sprite de nubes inferiores B std::unique_ptr buildings_sprite_; // Sprite de edificios std::unique_ptr gradient_sprite_; // Sprite de gradiente std::unique_ptr grass_sprite_; // Sprite de hierba std::unique_ptr sun_sprite_; // Sprite del sol std::unique_ptr moon_sprite_; // Sprite de la luna // --- Variables de configuración --- const float total_progress_to_complete_; // Progreso total para completar const float progress_per_stage_; // Progreso por etapa const float sun_completion_progress_; // Progreso de completado del sol ProgressCallback progress_callback_; // Callback para notificar cambios de progreso // --- Variables de estado --- std::vector sun_path_; // Recorrido del sol std::vector moon_path_; // Recorrido de la luna std::array gradient_rect_; // Fondos degradados std::array top_clouds_rect_; // Nubes superiores std::array bottom_clouds_rect_; // Nubes inferiores SDL_FRect rect_; // Tamaño del objeto SDL_FRect src_rect_; // Parte del objeto para copiar en pantalla SDL_FRect dst_rect_; // Posición en pantalla donde se copia el objeto Color attenuate_color_; // Color de atenuación State state_ = State::NORMAL; // Estado actual float progress_ = 0.0F; // Progresión interna float clouds_speed_ = 0; // Velocidad de las nubes float transition_ = 0; // Porcentaje de transición size_t gradient_number_ = 0; // Índice de fondo degradado size_t counter_ = 0; // Contador interno size_t alpha_color_texture_ = 0; // Transparencia de atenuación size_t previous_alpha_color_texture_ = 0; // Transparencia anterior size_t sun_index_ = 0; // Índice del recorrido del sol size_t moon_index_ = 0; // Índice del recorrido de la luna int base_ = 0; // Posición base del fondo Uint8 alpha_ = 0; // Transparencia entre fases bool manual_mode_ = false; // Si está en modo manual // --- Métodos internos --- void initializePaths(); // Inicializa las rutas del sol y la luna void initializeRects(); // Inicializa los rectángulos de gradientes y nubes void initializeSprites(); // Crea los sprites void initializeSpriteProperties(); // Configura las propiedades iniciales de los sprites void initializeTextures(); // Inicializa las texturas de renderizado void updateProgression(); // Actualiza la progresión y calcula transiciones void updateCloudsSpeed(); // Actualiza la velocidad de las nubes según el estado void renderGradient(); // Dibuja el gradiente de fondo void renderTopClouds(); // Dibuja las nubes superiores void renderBottomClouds(); // Dibuja las nubes inferiores void fillCanvas(); // Compone todos los elementos en la textura void updateAlphaColorTexture(); // Actualiza el alpha de la textura de atenuación void updateClouds(); // Actualiza el movimiento de las nubes void createSunPath(); // Precalcula el recorrido del sol void createMoonPath(); // Precalcula el recorrido de la luna };