|
JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
|
É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. | |
É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.
|
explicitnoexcept |
| seed | Graine explicite (par défaut DEFAULT_PARTICLE_SEED), jamais l'horloge. |
|
inlinenodiscardnoexcept |
| void core::ParticleSystem::clear | ( | World & | world | ) |
Détruit toutes les particules vivantes (rechargement de niveau, LOT-53 TACHE-02).
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.
| world | Monde ECS recevant les particules. |
| position | Position du personnage, en unités monde. |
| facing | Sens horizontal du mouvement (-1/+1) : la traînée part de l'arrière du mouvement (opposé à l'orientation). |
Éclatement à la mort du personnage : rafale en cercle complet.
| world | Monde ECS recevant les particules. |
| position | Position du personnage au moment de l'échec, en unités monde. |
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.
| world | Monde ECS recevant les particules. |
| position | Position du personnage à l'atterrissage, en unités monde. |
| impactSpeed | Vitesse verticale (positive, vers le bas) au moment de l'impact. |
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.
| 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.
| world | Monde ECS recevant les entités-particules. |
| effect | Effet à émettre (constantes nommées côté appelant). |
| origin | Position d'émission, en unités monde. |
| direction | Direction de base (n'a pas besoin d'être normalisée) ; sans effet si effect.spreadRadians >= π (dispersion en cercle complet). |
| kind | Effet visuel porté par chaque particule émise (présentation, HMI). |
| 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.
| world | Monde ECS portant les entités-particules. |
| fixedDelta | Durée du pas, en secondes. |
|
private |
|
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.
|
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).