feat(playfield): reaccions orbit al pas de la nau i pulse al spawn de fireworks
This commit is contained in:
1 parent
ffeff3d69d
commit
20f5b83649
6 files changed
+238
-13
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in new issue
Block a user