#pragma once #include // Para SDL_Rect, SDL_Point #include // Para SDL_Texture, SDL_Renderer #include // Para size_t #include // Para unique_ptr, shared_ptr #include // Para vector #include "utils.h" // Para Color class MovingSprite; // lines 7-7 class Sprite; // lines 8-8 class Texture; // lines 9-9 /* Esta clase es la encargada de dibujar el fondo que aparece durante la sección jugable. Utiliza una textura donde compone la imagen y luego tiene una textura superior rellena de un color sólido cuya opacidad se puede modificar. El objeto tiene un tamaño total definido en la variable "rect". En principio este tamaño coincide con el tamaño de la ventana o resolución del juego, pero se pinta solo el rectangulo definido en srcRect en la posición de la pantalla definida en dstRect. Ambos rectangulos han de coincidir en tamaño y por definición, el punto comun es el inferior derecho el rectangulo. Utiliza varios métodos para definir su comportamiento: - setCloudsSpeed(float value) Velocidad a la que se desplazan las nubes cada frame - setGradientNumber(int value) Escoge el índice de la textura de fondo a usar (el color del cielo) - setTransition(float value) Porcentaje (entre 0.0f (textura actual) y 1.0f (textura siguiente)) para mostrar entre la textura de fondo actual y la siguiente - setColor(Color color) Establece el color de la textura de superposición - setAlpha(int alpha) Establece la transparencia de la textura de superposición */ // Clase Background class Background { private: // Objetos y punteros SDL_Renderer *renderer_; // El renderizador de la ventana std::shared_ptr buildings_texture_; // Textura con los edificios de fondo std::shared_ptr top_clouds_texture_; // Textura con las nubes de fondo std::shared_ptr bottom_clouds_texture_; // Textura con las nubes de fondo std::shared_ptr grass_texture_; // Textura con la hierba del suelo std::shared_ptr gradients_texture_; // Textura con los diferentes colores de fondo del juego std::shared_ptr sun_texture_; // Textura con el sol std::shared_ptr moon_texture_; // Textura con la luna std::unique_ptr top_clouds_sprite_a_; // Sprite para las nubes superiores std::unique_ptr top_clouds_sprite_b_; // Sprite para las nubes superiores std::unique_ptr bottom_clouds_sprite_a_; // Sprite para las nubes inferiores std::unique_ptr bottom_clouds_sprite_b_; // Sprite para las nubes inferiores std::unique_ptr buildings_sprite_; // Sprite con los edificios de fondo std::unique_ptr gradient_sprite_; // Sprite con los graficos del degradado de color de fondo std::unique_ptr grass_sprite_; // Sprite para la hierba std::unique_ptr sun_sprite_; // Sprite para el sol std::unique_ptr moon_sprite_; // Sprite para la luna SDL_Texture *canvas_; // Textura para componer el fondo SDL_Texture *color_texture_; // Textura para atenuar el fondo // Variables SDL_Rect gradient_rect_[4]; // Vector con las coordenadas de los 4 degradados para el cielo SDL_Rect top_clouds_rect_[4]; // Vector con las coordenadas de los 4 nubes de arriba SDL_Rect bottom_clouds_rect_[4]; // Vector con las coordenadas de los 4 nubes de abajo int gradient_number_ = 0; // Indica el número de degradado de fondo que se va a dibujar int alpha_ = 0; // Transparencia entre los dos degradados float clouds_speed_ = 0; // Velocidad a la que se desplazan las nubes float transition_ = 0; // Nivel de transición del fondo 0..1 int counter_ = 0; // Contador interno SDL_Rect rect_; // Tamaño del objeto fondo SDL_Rect src_rect_; // Parte del objeto fondo que se va a dibujará en pantalla SDL_Rect dst_rect_; // Posición donde dibujar la parte del objeto fondo que se dibujará en pantalla int base_; // Linea de fondo coincidente con el area inferior de la zona de juego Color attenuate_color_; // Color para atenuar el fondo int alpha_color_text_; // Alpha para atenuar el fondo int alpha_color_text_temp_; // Valor temporal para hacer la transición de alpha std::vector sun_path_; // Vector con el recorrido del sol std::vector moon_path_; // Vector con el recorrido de la luna size_t sun_index_ = 0; // Posición del vector del recorrido del sol size_t moon_index_ = 0; // Posición del vector del recorrido de la luna // Dibuja el gradiente de fondo void renderGradient(); // Dibuja las nubes de arriba void renderTopClouds(); // Dibuja las nubes de abajo void renderBottomClouds(); // Compone todos los elementos del fondo en la textura void fillCanvas(); // Actualiza el valor de alpha void updateAlphaColorTexture(); // Actualiza las nubes void updateClouds(); // Precalcula el vector con el recorrido del sol void createSunPath(); // Precalcula el vector con el recorrido de la luna void createMoonPath(); public: // Constructor Background(); // Destructor ~Background(); // Actualiza la lógica del objeto void update(); // Dibuja el objeto void render(); // Establece la posición del objeto void setPos(SDL_Rect pos); // Vuelve a cargar las texturas void reloadTextures(); // Ajusta el valor de la variable void setCloudsSpeed(float value); // Ajusta el valor de la variable void setGradientNumber(int value); // Ajusta el valor de la variable void setTransition(float value); // Establece el color de atenuación void setColor(Color color); // Establece la transparencia de la atenuación void setAlpha(int alpha); // Establece la posición del sol void setSunProgression(float progress); // Establece la posición de la luna void setMoonProgression(float progress); };