Files
coffee_crisis_arcade_edition/source/tiled_bg.h
2025-03-27 09:43:19 +01:00

76 lines
2.2 KiB
C++

#pragma once
#include <SDL3/SDL_rect.h> // Para SDL_FRect
#include <SDL3/SDL_render.h> // 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_FRect pos_; // Posición y tamaño del mosaico
SDL_FRect 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_FRect 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; }
};