|
JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
|
Distance de plus court chemin en nombre de cases (4-connexité, respectant les cases statiquement solides d'un core::TileMap), pré-calculée une fois par BFS multi-source depuis une case cible. More...
#include <GridDistanceField.h>
Public Member Functions | |
| GridDistanceField (const core::TileMap &tileMap, const core::GridPosition &target) | |
Calcule le champ par BFS à partir de l'unique case target. | |
| GridDistanceField (const core::TileMap &tileMap, const std::vector< core::GridPosition > &targets) | |
Calcule le champ par BFS multi-source à partir de targets. | |
| int | distance (const core::GridPosition &position) const noexcept |
Distance de plus court chemin, en nombre de cases, depuis position jusqu'à la case cible passée au constructeur. | |
| bool | isReachable (const core::GridPosition &position) const noexcept |
La cible est-elle atteignable depuis position par un chemin de cases non solides ? | |
| int | unreachableDistance () const noexcept |
Private Attributes | |
| int | _width |
| int | _height |
| std::vector< int > | _distances |
Distance de plus court chemin en nombre de cases (4-connexité, respectant les cases statiquement solides d'un core::TileMap), pré-calculée une fois par BFS multi-source depuis une case cible.
Sert de base à la récompense de progression (EX-IA-023). La propriété recherchée est que tout pas rapprochant du but sur un chemin réellement empruntable soit récompensé, y compris un détour imposé par un mur : une distance à vol d'oiseau pénaliserait ce détour, et dirigerait donc l'agent contre la seule solution disponible.
Le coût est borné par construction : un unique BFS à quatre voisins, sans pondération ni replanification, puis des lectures O(1). La distance se compte en nombre de cases, jamais en coût de déplacement – il n'y a pas de planificateur de chemin ici.
Accepte n'importe quelle core::TileMap, et c'est le choix de cette grille qui fixe ce que « empruntable » veut dire :
Une porte verrouillée encore fermée doit être vue comme un mur, sans quoi le champ mesure la progression le long d'un chemin qui n'existe pas et la clé qui l'ouvre ne raccourcit rien.
| core::GridDistanceField::GridDistanceField | ( | const core::TileMap & | tileMap, |
| const core::GridPosition & | target ) |
Calcule le champ par BFS à partir de l'unique case target.
| tileMap | Grille de collision (cases solides/non-solides) – core::MechanismController:: collisionMap() pour respecter l'état courant des portes, core::Level::tileMap() pour la seule solidité statique. |
| target | Case cible (typiquement core::Level::exit()), point de départ du BFS. |
| core::GridDistanceField::GridDistanceField | ( | const core::TileMap & | tileMap, |
| const std::vector< core::GridPosition > & | targets ) |
Calcule le champ par BFS multi-source à partir de targets.
Généralise le constructeur à cible unique : la distance renvoyée par distance() est celle au plus proche élément de targets, ce qui permet de faire cohabiter la sortie du niveau avec les positions des déclencheurs (core::Mechanism::switchPosition) pas encore résolus comme cibles concurrentes – l'objectif immédiat le plus proche, sans hiérarchie ni connaissance de l'ordre de résolution attendu.
| tileMap | Grille de collision (voir constructeur à cible unique). |
| targets | Cases cibles ; une case hors-grille ou solide est simplement ignorée (garde défensive, ne fait pas échouer les autres cibles). Vide -> champ entièrement inatteignable. |
|
nodiscardnoexcept |
Distance de plus court chemin, en nombre de cases, depuis position jusqu'à la case cible passée au constructeur.
| position | Case dont on veut la distance ; hors-grille traitée comme inatteignable. |
position est hors-grille ou ne peut atteindre la cible par aucun chemin de cases non solides.
|
nodiscardnoexcept |
La cible est-elle atteignable depuis position par un chemin de cases non solides ?
Distingue une distance réelle de la sentinelle rendue par distance(), que rien ne permet sinon de reconnaître : la sentinelle vaut largeur × hauteur, soit 576 sur une grille 24 × 24, et une progression calculée entre une case atteignable et une case qui ne l'est pas vaudrait donc ±576 sur un seul pas.
| position | Case à tester ; hors-grille traitée comme inatteignable. |
|
inlinenodiscardnoexcept |
|
private |
|
private |
|
private |