#pragma once #include // Para SDL_Rect #include // Para SDL_Renderer, SDL_Texture #include "utils.h" // Modos de funcionamiento para el tileado de fondo enum class TiledBGMode : int { CIRCLE = 0, DIAGONAL = 1, RANDOM = 2, STATIC = 3, }; /* Esta clase dibuja un tileado de fondo. Para ello se sirve de una textura "canvas", que rellena con los tiles. El rectangulo "window" recorre la textura de diferentes formas para generar el efecto de movimiento de la textura en pantalla */ // Clase TiledBG class TiledBG { private: // Constantes static constexpr int TILE_WIDTH_ = 64; // Ancho del tile static constexpr int TILE_HEIGHT_ = 64; // Alto del tile // Objetos y punteros SDL_Renderer *renderer_; // El renderizador de la ventana SDL_Texture *canvas_; // Textura donde dibujar el fondo formado por tiles // Variables SDL_Rect pos_; // Posición y tamaño del mosaico SDL_Rect window_; // Ventana visible para la textura de fondo del titulo TiledBGMode mode_; // Tipo de movimiento del mosaico double sin_[360]; // Vector con los valores del seno precalculados float desp_ = 0.0f; // Desplazamiento aplicado float speed_ = 1.0f; // Incremento que se añade al desplazamiento a cada bucle bool stopping_ = false; // Indica si se está deteniendo // Rellena la textura con el contenido void fillTexture(); // Actualiza el desplazamiento void updateDesp() { desp_ += speed_; } // Detiene el desplazamiento de forma ordenada void updateStop(); public: // Constructor TiledBG(SDL_Rect pos, TiledBGMode mode); // Destructor ~TiledBG(); // Pinta la clase en pantalla void render(); // Actualiza la lógica de la clase void update(); // Establece la velocidad void setSpeed(float speed) { speed_ = speed; } // Detiene el desplazamiento de forma ordenada void stopGracefully() { stopping_ = true; } // Cambia el color de la textura void setColor(Color color) { SDL_SetTextureColorMod(canvas_, color.r, color.g, color.b); } // Indica si está parado bool isStopped() const { return speed_ == 0.0f; } };