// playfield.hpp - Fons del playfield (graella + sub-graella amb animació de creació) // © 2026 JailDesigner // // La graella es construeix una sola vegada al constructor. El draw és stateless: // rep un `creation_progress` global ∈ [0, 1] i cada línia computa quina porció // li toca dibuixar segons el seu slot a la timeline. // // Disseny preparat per a futures capacitats: // - Línies "vives" que reaccionen a explosions / pas de la nau (reaction_intensity). // - Capes addicionals al fons (estrelles, gradients, scanlines). #pragma once #include #include "core/rendering/render_context.hpp" #include "core/types.hpp" namespace Graphics { class Playfield { public: explicit Playfield(Rendering::Renderer* renderer); // Avança el timer intern de creació. void update(float delta_time); // Pinta la graella. La porció dibuixada de cada línia depèn del timer intern. void draw() const; private: struct Line { Vec2 start; // top (verticals) o left (horitzontals) Vec2 end; // bottom (verticals) o right (horitzontals) float brightness; // base (GRID_BRIGHTNESS o SUBGRID_BRIGHTNESS) float spawn_time_s; // moment de naixement (verticals i horitzontals tenen ritmes independents) }; void buildLines(); [[nodiscard]] auto computeLineProgress(const Line& line) const -> float; Rendering::Renderer* renderer_; std::vector lines_; float elapsed_s_{0.0F}; }; } // namespace Graphics