feat(playfield): reaccions orbit al pas de la nau i pulse al spawn de fireworks

This commit is contained in:
JailDesigner committed 2026-05-21 23:03:48 +02:00
1 parent ffeff3d69d
commit 20f5b83649
6 files changed
+238 -13

No files matched your search

+5
View File
@@ -70,6 +70,11 @@ namespace Effects {
return;
}
// Notificar als subscriptors (playfield pulses, etc.).
if (spawn_callback_) {
spawn_callback_(origen);
}
const float ANGLE_STEP = 2.0F * Defaults::Math::PI / static_cast<float>(n_points);
const float JITTER_RAD =
Defaults::FX::Firework::ANGULAR_JITTER_DEG * Defaults::Math::PI / 180.0F;
+10
View File
@@ -6,6 +6,8 @@
#include <SDL3/SDL.h>
#include <array>
#include <functional>
#include <utility>
#include "core/defaults.hpp"
#include "core/rendering/render_context.hpp"
@@ -18,8 +20,15 @@ namespace Effects {
// d'`origen`. Cada partícula viu independent (update/draw/rebot).
class FireworkManager {
public:
// Notificació opcional cada vegada que es genera un burst.
using SpawnCallback = std::function<void(Vec2 origen)>;
explicit FireworkManager(Rendering::Renderer* renderer);
void setSpawnCallback(SpawnCallback callback) {
spawn_callback_ = std::move(callback);
}
// Emet un burst radial:
// origen: punt central del burst.
// color: color de les línies (heretat del pare).
@@ -40,6 +49,7 @@ namespace Effects {
private:
Rendering::Renderer* renderer_;
SpawnCallback spawn_callback_;
static constexpr int POOL_SIZE = Defaults::FX::Firework::POOL_SIZE;
std::array<Firework, POOL_SIZE> pool_;
+12
View File
@@ -75,6 +75,11 @@ GameScene::GameScene(SDLManager& sdl, SceneContext& context)
border_.bumpAt(hit.contact_point, STRENGTH);
});
// Fireworks generen un pulse a les línies V i H més properes del playfield.
firework_manager_.setSpawnCallback([this](Vec2 origen) {
playfield_.notifyFireworkSpawn(origen);
});
// Explosions properes a una paret també generen bump (falloff lineal amb la distància).
debris_manager_.setExplosionCallback([this](Vec2 center) {
const SDL_FRect& zona = Defaults::Zones::PLAYAREA;
@@ -210,6 +215,13 @@ void GameScene::stepPhysics(float delta_time) {
trail_manager_.update(delta_time, ships_);
playfield_.update(delta_time);
border_.update(delta_time);
// Notificar al playfield que la nau ha passat (per excitar línies properes).
for (const auto& ship : ships_) {
if (ship.isActive()) {
playfield_.notifyShipPass(ship.getCenter(), ship.getSpeed());
}
}
}
void GameScene::stepShootingInput() {