// starfield.hpp - Sistema d'estrelles de fons amb efecte de profunditat // © 2025 Orni Attack #pragma once #include #include #include #include "core/graphics/shape.hpp" #include "core/types.hpp" namespace Graphics { // Configuració per cada capa de profunditat struct CapaConfig { float velocitat_base; // Velocitat base d'aquesta capa (px/s) float escala_min; // Escala mínima prop del centre float escala_max; // Escala màxima al límit de pantalla int num_estrelles; // Nombre d'estrelles en aquesta capa }; // Classe Starfield - camp d'estrelles animat amb efecte de profunditat class Starfield { public: // Constructor // - renderer: SDL renderer // - punt_fuga: punt d'origen/fuga des d'on surten les estrelles // - area: rectangle on actuen les estrelles (SDL_FRect) // - densitat: nombre total d'estrelles (es divideix entre capes) Starfield(SDL_Renderer* renderer, const Punt& punt_fuga, const SDL_FRect& area, int densitat = 150); // Actualitzar posicions de les estrelles void actualitzar(float delta_time); // Dibuixar totes les estrelles void dibuixar(); // Setters per ajustar paràmetres en temps real void set_punt_fuga(const Punt& punt) { punt_fuga_ = punt; } void set_brightness(float multiplier); private: // Estructura interna per cada estrella struct Estrella { Punt posicio; // Posició actual float angle; // Angle de moviment (radians) float distancia_centre; // Distància normalitzada del centre (0.0-1.0) int capa; // Índex de capa (0=lluny, 1=mitjà, 2=prop) }; // Inicialitzar una estrella (nova o regenerada) void inicialitzar_estrella(Estrella& estrella) const; // Verificar si una estrella està fora de l'àrea [[nodiscard]] bool fora_area(const Estrella& estrella) const; // Calcular escala dinàmica segons distància del centre [[nodiscard]] float calcular_escala(const Estrella& estrella) const; // Calcular brightness dinàmica segons distància del centre [[nodiscard]] float calcular_brightness(const Estrella& estrella) const; // Dades std::vector estrelles_; std::vector capes_; // Configuració de les 3 capes std::shared_ptr shape_estrella_; SDL_Renderer* renderer_; // Configuració Punt punt_fuga_; // Punt d'origen de les estrelles SDL_FRect area_; // Àrea activa float radi_max_; // Distància màxima del centre al límit de pantalla int densitat_; // Nombre total d'estrelles float multiplicador_brightness_{1.0F}; // Multiplicador de brillantor (1.0 = default) }; } // namespace Graphics