Suivre un chemin en douceur

9

Je fais actuellement un jeu de tower defense 2D avec une voie statique prédéterminée que les ennemis suivent (c'est-à-dire que les tours ne peuvent pas bloquer le chemin et la recherche de chemin n'est pas le problème que j'essaie de résoudre).

J'essaie de comprendre exactement comment faire en sorte que les unités suivent cette voie de manière fluide . J'ai deux idées approximatives sur la façon de procéder, mais j'aimerais avoir des informations sur ce qui sera probablement plus facile à mettre en œuvre / la technique plus standard. Ou bien sûr, s'il y a une manière totalement différente que je n'ai pas envisagée, j'aimerais aussi en savoir plus.

Waypoints: Ma première idée a été de définir le chemin comme une série de waypoints codés en dur. Les unités utiliseraient alors un algorithme de pilotage de base "rechercher" (comme celui- ci) pour se déplacer successivement vers chaque waypoint le long du chemin. Cependant, je me suis demandé s'il ne serait pas difficile d'empêcher les unités de s'écarter trop de la voie que je veux qu'elles suivent. Je me demande si l'incapacité de tourner suffisamment brusquement pourrait les amener à "glisser" hors de la voie souhaitée. Je suppose que je pourrais peut-être empêcher cela en permettant l'application d'une force de direction relativement forte?

Courbes de Bézier: La deuxième solution que j'ai envisagée consiste à définir le chemin avec une courbe de Bézier et à chaque pas de temps calculer le point le long de la courbe avec est (dt * vitesse) loin de l'emplacement actuel de l'unité. Je soupçonne que cette technique faciliterait la définition précise du chemin que les unités suivront, mais je ne sais pas exactement comment procéder pour l'implémenter. Aucune suggestion?

De plus, je ne pense pas que cela changera les réponses de quiconque, mais les unités doivent également pouvoir voyager à une vitesse constante le long du chemin. De plus, je programme ce jeu en python en utilisant le framework pyglet.

Si quelque chose au sujet de la question n'est pas clair, faites-le moi savoir.

Edit: Aussi, quelle que soit sa valeur, j'essaie en quelque sorte de reproduire le comportement de mouvement des ennemis dans Kingdom Rush .

Pwnosaurus
la source
Pertinent: gamasutra.com/view/feature/131505/… Quel type de densité / taille unitaire par rapport aux tuiles utilisez-vous?
singe
Je vais jeter un œil à cet article! Cependant, je n'utilise pas de tuiles, juste des coordonnées continues pour désigner la position. Il y aura juste une image de fond statique qui montre au joueur où les unités se déplaceront.
Pwnosaurus
J'ai aussi trouvé. gamedev.stackexchange.com/questions/26543/… A * fonctionne sur les cartes sans grille. Il pourrait s'agir d'un chemin de nœud sur le royaume qui se courbe de la même manière.
singe
Y a-t-il quelque chose qui puisse faire que les ennemis quittent le chemin et doivent y retourner? Je pose la question parce que votre proposition de courbe de Bézier suggère qu'il n'y en a pas, auquel cas il n'y a aucune raison pour laquelle vous ne pouvez pas pré-calculer des données arbitraires sur l'ensemble du chemin et aucune logique "AI" n'est nécessaire.
Kevin Reid

Réponses:

8

Permettez-moi de vous présenter le célèbre article de Craig Reynolds sur les comportements de direction pour les personnages autonomes . Si vous ne l'avez pas lu, vous devriez, cela vous aidera à réfléchir à ces types de problèmes, en particulier jetez un œil à la section sur la recherche de chemin .

entrez la description de l'image ici

L'idée de l'article de Reynolds est que vous pouvez utiliser des forces simples qui se combinent pour produire une navigation improvisée réaliste dans l'environnement. Les mouvements ne sont pas basés sur la planification de trajectoire ou des calculs globaux, mais utilisent plutôt des informations locales, telles que les forces des voisins, ce qui les rend simples à comprendre et à mettre en œuvre, mais produisent toujours des modèles de mouvement très complexes.

La beauté de l'approche est que vous pouvez combiner plusieurs comportements ensemble. Ainsi, par exemple, vos personnages peuvent avoir à la fois un comportement de recherche de chemin ainsi qu'un comportement de séparation (pour les empêcher de s'agglutiner trop), qui peuvent être combinés sous forme de somme pondérée.

Un autre avantage de l'utilisation des comportements de pilotage est qu'il existe un certain nombre d'implémentations open source existantes dans une variété de langages (par exemple, opensteer ).


MISE À JOUR: J'ai jeté un coup d'œil à Kingdom Rush, et je pense que j'ai peut-être mal compris ce que vous entendiez par «en douceur». Je l'ai pris pour signifier plus réaliste, mais je pense que ce que vous recherchez ressemble plus à des personnages sur une voie ferrée. Aussi, en lisant plus attentivement, je vois que l'une de vos exigences est que "les unités doivent pouvoir voyager à une vitesse constante le long du chemin". Les comportements de direction ne vous donneront pas une vitesse de déplacement constante, mais la recherche de cheminement simple combinée avec des points de cheminement le fera. (C'est-à-dire, n'utilisez pas le comportement de «recherche» pour arriver au point de cheminement, déterminez plutôt le vecteur de direction et laissez l'unité se déplacer à pleine vitesse jusqu'à ce point de cheminement.) Utilisez plus de points de cheminement pour aplanir l'itinéraire.

Cameron Fredman
la source
2

La solution dans cet article Gamasutra peut être ce que vous recherchez. L'idée de base est de projeter des rayons sur un waypoint qui est à deux pas de votre waypoint actuel, "faisant un pas" au rayon d'une fraction de la longueur d'une cellule et à chaque "pas" du rayon, vérifiant si le volume de collision de votre joueur entre en collision avec quoi que ce soit. à la position étagée du rayon. Si le rayon arrive jusqu'au point de cheminement qui a deux étapes d'avance, vous pouvez vous débarrasser du point de cheminement intermédiaire. vous pouvez ensuite continuer ce même processus jusqu'au waypoint "objectif" ... donc si votre chemin peut être accompli par une ligne droite vers le but, une ligne droite vers le but est la route que votre personnage prendra. voici l'article: http://www.gamasutra.com/view/feature/131505/toward_more_realistic_pathfinding.

Il contient également de grandes choses sur le rayon de virage et des comportements de virage plus naturels et autres ...

Austin
la source