JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
Loading...
Searching...
No Matches
core::ParticleSystem Class Reference

Émet et simule des particules visuelles au pas fixe, strictement déterministe. More...

#include <ParticleSystem.h>

Public Member Functions

 ParticleSystem (std::uint64_t seed=DEFAULT_PARTICLE_SEED) noexcept
void update (World &world, float fixedDelta)
 Avance toutes les particules vivantes d'un pas fixe.
void spawn (World &world, const ParticleEffect &effect, Vector2 origin, Vector2 direction, ParticleKind kind)
 Émet les particules d'un effet, à partir d'une origine et d'une direction de base.
void emitDashTrail (World &world, Vector2 position, float facing)
 Traînée de dash (émission continue, pas ponctuelle, LOT-53 TACHE-02).
void emitLanding (World &world, Vector2 position, float impactSpeed)
 Bouffée de poussière à l'atterrissage, d'intensité fonction de la vitesse d'impact.
void emitDeath (World &world, Vector2 position)
 Éclatement à la mort du personnage : rafale en cercle complet.
void clear (World &world)
 Détruit toutes les particules vivantes (rechargement de niveau, LOT-53 TACHE-02).
int aliveCount () const noexcept

Private Member Functions

Entity reserveSlot (World &world)
 Réserve l'emplacement d'une nouvelle particule : recycle la plus ancienne (front de _order) si le budget (MAX_PARTICLES) est atteint, sinon crée une entité neuve.

Private Attributes

std::uint64_t _baseSeed
std::uint64_t _stepIndex = 0
 Numéro de pas courant, incrémenté par update() – entre dans la graine de chaque particule émise (core::deriveSeed), jamais l'horloge (EX-NFR-002).
std::vector< Entity_order
 Entités-particules vivantes, dans leur ordre d'émission (la plus ancienne en tête) : source de vérité de l'intégration et du recyclage, indépendante du sparse set de l'ECS.

Detailed Description

Émet et simule des particules visuelles au pas fixe, strictement déterministe.

Les particules sont des entités du core::World portant un core::Particle (pas un tableau interne) : le sparse set de l'ECS n'offre aucun ordre d'itération stable après un retrait (swap-and-pop, core::ComponentPool), c'est pourquoi le système tient sa propre liste d'ordre d'émission (_order), seule source de vérité pour l'intégration et le recyclage.

Aléa maîtrisé (EX-NFR-002) : chaque particule tire ses valeurs d'un core:: DeterministicRandom reseedé pour elle seule, à partir de la graine de base, du numéro de pas courant et de l'identifiant de son entité (core::deriveSeed) – jamais l'horloge système, jamais un générateur par défaut. Deux exécutions de la même séquence d'appels produisent donc exactement les mêmes particules.

Budget borné (EX-NFR-005) : au-delà de MAX_PARTICLES vivantes, spawn() recycle la plus ancienne (front de _order) plutôt que d'allouer sans limite – décision déterministe, jamais dépendante d'un ordre d'itération instable.

Aucun effet de gameplay (EX-ARCH-012) : les particules ne collisionnent pas, ne sont jamais lues par un système de jeu, et n'affectent aucune entité core::Actor.

Constructor & Destructor Documentation

◆ ParticleSystem()

core::ParticleSystem::ParticleSystem ( std::uint64_t seed = DEFAULT_PARTICLE_SEED)
explicitnoexcept
Parameters
seedGraine explicite (par défaut DEFAULT_PARTICLE_SEED), jamais l'horloge.

Member Function Documentation

◆ aliveCount()

int core::ParticleSystem::aliveCount ( ) const
inlinenodiscardnoexcept
Returns
Le nombre de particules actuellement vivantes.

◆ clear()

void core::ParticleSystem::clear ( World & world)

Détruit toutes les particules vivantes (rechargement de niveau, LOT-53 TACHE-02).

◆ emitDashTrail()

void core::ParticleSystem::emitDashTrail ( World & world,
Vector2 position,
float facing )

Traînée de dash (émission continue, pas ponctuelle, LOT-53 TACHE-02).

Sans appelant depuis le LOT-06 : le dash était une capacité du personnage de plateforme, retirée avec lui. Conservée telle quelle plutôt que supprimée — une capacité de ruée reviendra très probablement au RPG (LOT-25), et cet émetteur n'a rien de spécifique au genre.

Parameters
worldMonde ECS recevant les particules.
positionPosition du personnage, en unités monde.
facingSens horizontal du mouvement (-1/+1) : la traînée part de l'arrière du mouvement (opposé à l'orientation).

◆ emitDeath()

void core::ParticleSystem::emitDeath ( World & world,
Vector2 position )

Éclatement à la mort du personnage : rafale en cercle complet.

Parameters
worldMonde ECS recevant les particules.
positionPosition du personnage au moment de l'échec, en unités monde.

◆ emitLanding()

void core::ParticleSystem::emitLanding ( World & world,
Vector2 position,
float impactSpeed )

Bouffée de poussière à l'atterrissage, d'intensité fonction de la vitesse d'impact.

Sans effet en-dessous de LANDING_MIN_IMPACT_SPEED (un petit pas ne doit produire aucune poussière) ; au-delà de LANDING_MAX_IMPACT_SPEED, l'effet plafonne à LANDING_DUST_MAX_ COUNT particules – une chute longue produit ainsi plus de poussière qu'un petit saut, sans devenir illisible pour une chute extrême.

Parameters
worldMonde ECS recevant les particules.
positionPosition du personnage à l'atterrissage, en unités monde.
impactSpeedVitesse verticale (positive, vers le bas) au moment de l'impact.

◆ reserveSlot()

Entity core::ParticleSystem::reserveSlot ( World & world)
nodiscardprivate

Réserve l'emplacement d'une nouvelle particule : recycle la plus ancienne (front de _order) si le budget (MAX_PARTICLES) est atteint, sinon crée une entité neuve.

◆ spawn()

void core::ParticleSystem::spawn ( World & world,
const ParticleEffect & effect,
Vector2 origin,
Vector2 direction,
ParticleKind kind )

Émet les particules d'un effet, à partir d'une origine et d'une direction de base.

Chaque particule tire sa vitesse (norme dans [speedMin, speedMax], angle dans [-spreadRadians, +spreadRadians] autour de la direction de base) et sa durée de vie dans [lifeMin, lifeMax], d'un générateur reseedé pour elle (voir en-tête de la classe) : le résultat ne dépend que de (graine de base, pas courant, identifiant d'entité), jamais de l'ordre ou du nombre d'appels à spawn au sein du même pas.

Parameters
worldMonde ECS recevant les entités-particules.
effectEffet à émettre (constantes nommées côté appelant).
originPosition d'émission, en unités monde.
directionDirection de base (n'a pas besoin d'être normalisée) ; sans effet si effect.spreadRadians >= π (dispersion en cercle complet).
kindEffet visuel porté par chaque particule émise (présentation, HMI).

◆ update()

void core::ParticleSystem::update ( World & world,
float fixedDelta )

Avance toutes les particules vivantes d'un pas fixe.

Intègre la position (position += vitesse × fixedDelta), décompte life, et détruit l'entité des particules dont la durée de vie atteint zéro ce pas – ni avant, ni après.

Parameters
worldMonde ECS portant les entités-particules.
fixedDeltaDurée du pas, en secondes.

Member Data Documentation

◆ _baseSeed

std::uint64_t core::ParticleSystem::_baseSeed
private

◆ _order

std::vector<Entity> core::ParticleSystem::_order
private

Entités-particules vivantes, dans leur ordre d'émission (la plus ancienne en tête) : source de vérité de l'intégration et du recyclage, indépendante du sparse set de l'ECS.

◆ _stepIndex

std::uint64_t core::ParticleSystem::_stepIndex = 0
private

Numéro de pas courant, incrémenté par update() – entre dans la graine de chaque particule émise (core::deriveSeed), jamais l'horloge (EX-NFR-002).


The documentation for this class was generated from the following files:
  • /home/runner/work/JustAnotherDnDGame/JustAnotherDnDGame/Source/Core/Ecs/Systems/ParticleSystem.h
  • /home/runner/work/JustAnotherDnDGame/JustAnotherDnDGame/Source/Core/Ecs/Systems/ParticleSystem.cpp