Files
orni-attack/source/core/graphics/playfield.hpp
T

50 lines
1.8 KiB
C++

// 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 <vector>
#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<Line> 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