Je fais du hack & slash game et je veux que mes personnages bougent, comme par exemple dans Torchlight, Diablo, etc. Actuellement, je génère un ensemble de nœuds pour toutes les zones d'un étage où il est possible de marcher. Lorsque je clique quelque part, le joueur y passe par le chemin interpolé des nœuds. Cela ne semble pas très naturel. Le joueur bouge comme un robot. Les ennemis utilisent également ce système de nœuds pour se déplacer et partagent le même problème, mais ils me posent un autre problème. Lorsque les ennemis détectent un joueur, ils le rejoignent par le chemin le plus court. Parfois, ils utilisent le même chemin et s’alignent au joueur au lieu de l’entourer. Je ne sais pas comment faire en sorte que les ennemis choisissent des chemins différents et entourent le joueur. Savez-vous comment puis-je résoudre ces problèmes? Peut-être que je devrais utiliser une approche différente pour le mouvement du personnage?
Ma technique actuelle:
Capture d'écran aux flambeaux:
---MISE À JOUR---
Je veux savoir comment faire face à ces situations:
Situation 1, j'ai des obstacles dynamiques / statiques sur mon chemin
Situation 2, les ennemis ont le même chemin d'accès au joueur (faites la queue pour combattre avec nous)
Réponses:
Comportements de direction en combinaison avec une structure de données de navigation .
Il y a plusieurs façons de le faire, mais c'est le concept de base. Il serait peut-être plus facile d’utiliser un maillage de navigation afin de pouvoir appliquer une recherche de trajectoire dans chaque section convexe.
Si vous tenez à conserver un graphique, vous pouvez utiliser un comportement de recherche pour chaque nœud du chemin, plutôt que de suivre de manière stricte un chemin d'un nœud à l'autre.
Une autre méthode que vous pouvez utiliser est Path Smoothing, mais gardez à l’esprit que cela coûte assez cher en calcul.
J'espère que ça t'as aidé.
MODIFIER:
Pour résoudre vos problèmes d’évitement d’obstacles, utilisez une sorte d’ évitement d’obstacles .
la source
Si vous préférez vous en tenir à un graphique de nœud plutôt que de basculer vers un maillage de navigation comme l'ont suggéré d'autres personnes, vous pouvez résoudre le problème de la "ligne au joueur au lieu de l'entourer" en assignant à chaque ennemi l'attaque à partir d'une direction particulière.
Il existe de nombreuses façons d’y parvenir, mais j’utilise habituellement un système de «jetons» pour attribuer des directions uniques aux monstres, l’objet joueur possédant un jeton pour chaque direction (nord, nord-est, est, etc.). Lorsqu'un ennemi veut accéder au joueur, il doit d'abord acquérir un jeton de lui. La direction spécifiée par le jeton indique au monstre de quel côté du joueur il est autorisé à se déplacer. Comme le joueur n'a qu'un jeton dans chaque direction, et que les monstres ont besoin d'un jeton avant de pouvoir attaquer, plusieurs monstres n'essaieront pas tous de se diriger vers le même côté du joueur, ce qui devrait les casser un peu.
De plus, vous pouvez également appliquer une petite pénalité aux nœuds lors du processus de recherche de chemins, pour encourager les monstres à s'approcher d'une direction qui correspond à leur jeton. (C’est-à-dire que si un monstre a le jeton qui lui permet d’attaquer de l’est, alors, dans le but de déterminer le "chemin le plus court" pour ce monstre, traitez tous les nœuds de chemin situés au nord / ouest / sud du joueur comme si: ils sont plusieurs nœuds, au lieu d'un seul). Cela permettra aux monstres de se séparer plus rapidement et d’essayer de flanquer le joueur au lieu de marcher jusqu’au joueur dans un fichier unique et de ne se propager qu’à la dernière étape.
la source
En gros, pour les ennemis, ce que vous voulez faire est de rechercher le chemin au niveau macro (pensez à générer des zones convexes et le chemin vers la zone dans laquelle se trouve le joueur), et à adopter des comportements de direction de style boid au niveau micro (une fois que vous êtes proche). au joueur).
Voici un exemple de comportement boid: http://www.red3d.com/cwr/boids/
Pour le joueur, je pense que torchlight effectue la recherche de trajectoire sur un maillage de navigation vers l'endroit où vous cliquez / glissez, et cela fonctionne plutôt bien. Cela peut sembler un peu plus déconnecté que le contrôle direct, mais cela conduit à de meilleurs résultats pour le joueur.
la source
il existe un algorithme nommé rrt qui est utilisé pour le problème de recherche de chemins dans le monde réel. la surface sur laquelle votre héros (ou vos ennemis) peut marcher est une entrée avec la surface que les objets peuvent déplacer, et en utilisant un algorithme d'optimisation, elle trouve un chemin vers votre destination. autant que je sache, cet algorithme est grandement utilisé dans les ligues robocup. il est rapide, trouve le chemin le plus court et évite les collisions et les virages serrés. vous pouvez utiliser ce diaporama PowerPoint pour comprendre comment il génère un chemin.
la source
Pour que les itinéraires exploratoires paraissent plus "réalistes", je vous suggère de consulter l'article sur les A * d'apparence naturelle dans Game Programming Gems Vol.1
la source