// 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) int slot; // posició a la timeline 0..total_slots-1 }; void buildLines(); [[nodiscard]] auto computeLineProgress(int slot) const -> float; Rendering::Renderer* renderer_; std::vector lines_; // verticals primer (ordenats per x), després horitzontals (ordenats per y) int total_slots_{0}; float spawn_interval_s_{0.0F}; // calculat a buildLines() perquè la última línia acabi a TOTAL_ANIMATION_DURATION_S float elapsed_s_{0.0F}; }; } // namespace Graphics