// starfield.hpp - Sistema de estrelles de fons con efecte de profunditat // © 2026 JailDesigner #pragma once #include "core/rendering/render_context.hpp" #include #include #include #include "core/graphics/shape.hpp" #include "core/types.hpp" namespace Graphics { // Configuración per cada capa de profunditat struct CapaConfig { float velocitat_base; // Velocidad base de esta capa (px/s) float escala_min; // Escala mínima prop del centro float escala_max; // Escala màxima al límit de pantalla int num_estrelles; // Nombre de estrelles en esta capa }; // Clase Starfield - camp de estrelles animat con efecte de profunditat class Starfield { public: // Constructor // - renderer: SDL renderer // - punt_fuga: point de origin/fuga des de on surten las estrelles // - area: rectangle on actuen las estrelles (SDL_FRect) // - densitat: nombre total de estrelles (es divideix entre capes) Starfield(Rendering::Renderer* renderer, const Vec2& punt_fuga, const SDL_FRect& area, int densitat = 150); // Actualitzar posicions de las estrelles void update(float delta_time); // Dibuixar todas las estrelles void draw(); // Setters per ajustar parámetros en time real void set_punt_fuga(const Vec2& point) { punt_fuga_ = point; } void set_brightness(float multiplier); private: // Estructura interna per cada estrella struct Estrella { Vec2 position; // Posición actual float angle; // Angle de movement (radians) float distancia_centre; // Distancia normalitzada del centro (0.0-1.0) int capa; // Índex de capa (0=lluny, 1=mitjà, 2=prop) }; // Inicialitzar una estrella (nueva o regenerada) void inicialitzar_estrella(Estrella& estrella) const; // Verificar si una estrella está fuera de l'àrea [[nodiscard]] auto fora_area(const Estrella& estrella) const -> bool; // Calcular scale dinàmica segons distancia del centro [[nodiscard]] auto calcular_escala(const Estrella& estrella) const -> float; // Calcular brightness dinàmica segons distancia del centro [[nodiscard]] auto calcular_brightness(const Estrella& estrella) const -> float; // Dades std::vector estrelles_; std::vector capes_; // Configuración de las 3 capes std::shared_ptr shape_estrella_; Rendering::Renderer* renderer_; // Configuración Vec2 punt_fuga_; // Vec2 de origin de las estrelles SDL_FRect area_; // Àrea activa float radi_max_; // Distancia màxima del centro al límit de pantalla int densitat_; // Nombre total de estrelles float multiplicador_brightness_{1.0F}; // Multiplicador de brightness (1.0 = default) }; } // namespace Graphics