52 lines
1.6 KiB
C++
52 lines
1.6 KiB
C++
// starfield_parallax.hpp - Capa més profunda del fons: estrelles 2D amb parallax
|
|
// © 2026 JailDesigner
|
|
//
|
|
// Estrelles 2D distribuïdes en 3 capes de profunditat. Cada capa té el seu
|
|
// factor parallax: el "món" es desplaça amb world_velocity i les estrelles
|
|
// d'una capa es mouen amb world_velocity * parallax_factor. Les més
|
|
// properes es mouen més (factor alt) → sensació de profunditat.
|
|
// Quan una estrella surt de PLAYAREA, reapareix per la banda oposada
|
|
// (wraparound).
|
|
|
|
#pragma once
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include <array>
|
|
|
|
#include "core/defaults/starfield_parallax.hpp"
|
|
#include "core/rendering/render_context.hpp"
|
|
#include "core/types.hpp"
|
|
|
|
namespace Graphics {
|
|
|
|
class StarfieldParallax {
|
|
public:
|
|
explicit StarfieldParallax(Rendering::Renderer* renderer);
|
|
|
|
// Avança el desplaçament de les estrelles segons world_velocity (vector
|
|
// del moviment del món en px/s; típicament = -ship_velocity).
|
|
// world_velocity == {0, 0} → estrelles quietes.
|
|
void update(float delta_time, Vec2 world_velocity);
|
|
|
|
void draw() const;
|
|
|
|
private:
|
|
struct Star {
|
|
float x{0.0F};
|
|
float y{0.0F};
|
|
int layer{0}; // 0=Far, 1=Mid, 2=Near
|
|
SDL_Color color{}; // tint precomputat entre blanc i cyan
|
|
};
|
|
|
|
void buildStars();
|
|
static auto layerBrightness(int layer) -> float;
|
|
static auto layerParallax(int layer) -> float;
|
|
static auto layerSize(int layer) -> int;
|
|
|
|
Rendering::Renderer* renderer_;
|
|
std::array<Star, Defaults::StarfieldParallax::TOTAL_COUNT> stars_{};
|
|
};
|
|
|
|
} // namespace Graphics
|