Pathfinding: Maillage de navigation basé sur les tuiles

8

Je suis en train de développer un RTS basé sur des tuiles en temps réel. Voici un exemple de carte:

Carte

Cette carte se compose de 4 régions avec 256 tuiles chacune. Les tuiles bleues représentent des obstacles. Les unités peuvent se déplacer dans les huit directions standard. Les unités sont liées aux tuiles; une tuile peut contenir une unité.

Ce sont quelques exemples des chemins idéaux que je recherche. Trucs A * typiques:

entrez la description de l'image ici

Ma question est: un maillage de navigation est-il applicable à un RTS basé sur des tuiles? Je n'ai vu que des cartes de navigation utilisées dans des jeux où les unités se déplacent librement et ne sont pas liées à une grille de tuiles. À quoi ressemblerait le maillage de navigation sur cette carte particulière? Un exemple d'image serait excellent.

mario_sunny
la source
Pour ce que ça vaut, je semble me rappeler avoir entendu qu'une partie de la "bizarrerie" de Starcraft I était due à la décision tardive de passer du 2D à la 3D isométrique - tout le code de trajet a été écrit en attendant un terrain 2D!
Raven Dreamer

Réponses:

10

Oui, les maillages de navigation sont toujours applicables aux jeux basés sur des tuiles. Bien qu'ils soient principalement utilisés comme optimisation. Par exemple, j'ai converti le coin inférieur gauche de votre image pour utiliser un maillage de navigation:

entrez la description de l'image ici

Dans ce cas, chaque carré vert serait un nœud de navigation. Comme vous pouvez le voir, cela réduit considérablement le nombre de nœuds que A * doit traiter. Les unités peuvent alors simplement se diriger vers le centre de chacun de ces nœuds.

La génération de ces nœuds est un problème différent. Il peut être complexe de décider comment former les nœuds. Il y a quelques questions sur le site où vous pourriez trouver des idées sur la façon dont vous souhaitez mettre en œuvre cela:

Subdiviser un polygone en boîtes de taille variable

Identification des motifs quadruples dans un tableau à deux dimensions

/programming/20220215/minimum-number-of-rectangles-in-shape-made-from-rectangles

Ce maillage de navigation peut également être essentiellement utilisé comme recherche de chemin "de premier passage". Si un chemin est trouvé dans le maillage de navigation, vous savez qu'un chemin existe. Il s'agit d'un test plus rapide pour voir si deux points sont connectés.

MichaelHouse
la source
1
J'ai du mal à comprendre comment cela est supérieur au pur A *. Comment votre navmesh optimiserait-il le calcul de pathfinding pour le chemin vert dans la réponse d'origine, par exemple?
mario_sunny
4
Le chemin vert a 15 nœuds, le chemin maillé en a 5. Cela n'inclut même pas le nombre d'impasses qui doivent être analysées lors de la recherche de ce chemin. Le but du maillage de navigation n'est pas nécessairement de faire les itinéraires les plus directs, c'est de réduire la quantité de nœuds que A * doit parcourir, augmentant ainsi considérablement la vitesse de A *. Il existe des stratégies pour placer des nœuds dans votre maillage de navigation qui peuvent trouver un équilibre entre les chemins directs et moins de nœuds (par exemple, des nœuds à chaque coin de tous les obstacles). Il existe également des optimisations qui peuvent être effectuées sur le chemin fini.
MichaelHouse
Je commence à comprendre. Le chemin vert serait-il différent avec l'optimisation navmesh? Vous semblez impliquer que l'unité se déplacera au centre de chaque rectangle sur son chemin vers le point final. Suggérez-vous que les optimisations post-A * raccourciraient le chemin?
mario_sunny
3
Oui, si vous utilisiez le centre de chaque nœud, le chemin serait différent. Cependant, vous pouvez décider d'utiliser autre chose que le centre (comme vous pourriez utiliser les coins de chaque nœud). Ou vous pouvez faire en sorte que vos nœuds ne soient pas plus grands que quatre carrés (ce qui fait moins de nœuds mais rend les nœuds plus proches de la géométrie). Ou vous pouvez effectuer des optimisations sur le chemin pour être plus direct après l'avoir trouvé. Vous pouvez même utiliser le maillage de navigation comme première passe, puis utiliser A * pour traverser chaque nœud (vous permettant de "cheminer au fur et à mesure", tandis que l'unité se déplace, répartissant l'impact sur les performances au fil du temps).
MichaelHouse