Se déplacer / éviter les obstacles

12

Je voudrais écrire un "jeu", où vous pouvez placer un obstacle (rouge), puis le point noir essaie de l'éviter et d'atteindre la cible verte.
J'utilise un moyen très simple pour l'éviter, si le point noir est proche du rouge, il change de direction et se déplace pendant un certain temps, puis il avance vers le point vert.
Chemin "irréaliste"

Comment pourrais-je créer un chemin "fluide" pour le "joueur" contrôlé par ordinateur?
Edit: la fluidité n'est pas le point principal, mais pour éviter le "mur" de blocage rouge et pour ne pas s'y écraser puis l' éviter.

Comment pourrais-je implémenter un algorithme de recherche de chemin si je n'ai que 3 points?
(Et qu'est-ce que cela rendrait les choses beaucoup plus compliquées, si vous pouviez placer plusieurs obstacles?)
Chemin lisse

utilisateur
la source

Réponses:

9

Une approche très courante et générale consiste à diviser votre espace mondial en grilles et à utiliser des algorithmes comme A *.

Ce lien m'a aidé à commencer à comprendre et à mettre en œuvre l'algorithme A *.

Modifier :

Une pensée plus simple qui me vient à l'esprit est ... une fois que vous avez le monde en mailles. Toujours, faites en sorte que le point noir suive la distance de Manhattan jusqu'au point vert. Ensuite, vous pouvez attribuer des poids à chaque cellule. Les obstacles peuvent avoir un poids élevé sur la cellule de la grille et la liberté de mouvement peut avoir (disons) 0 poids. Lorsque vous vous déplacez le long de la distance de Manhattan, pour chaque mouvement, vérifiez si le poids de la cellule suivante n'est pas supérieur au poids de la cellule actuelle. S'il est plus élevé, vérifiez le poids de la cellule adjacente, puis continuez.

J'espère que cela t'aides

brainydexter
la source
Cet article sur l'algorithme A * semble être ce que je cherchais, mais malheureusement ce que je ne sais toujours pas, c'est comment diviser mon "monde" en grilles: S
utilisateur
Ça dépend vraiment. Réflexion: divisez votre monde en une grille de 32 x 32 qui représenterait alors les positions dans un tableau 2D. Par exemple, dans votre cas: le point rouge est à 120, 120 pixels (ou 120/32 x 120/32: 3,75 x 3,75) 3,75 x 3,75 représente une position sur votre grille du monde (ou tableau 2D). Étant donné que les tableaux sont indexés par des nombres entiers, vous ne voulez en faire qu'une partie entière. Ainsi, le point rouge serait à 3 x 3. J'espère que cela vous aidera
brainydexter
18

Les comportements de direction sont conçus pour à peu près cet ensemble de problèmes exact.

http://www.red3d.com/cwr/steer/

Fondamentalement, vous combineriez le comportement d'évitement d'obstacles avec probablement le comportement de recherche ou de poursuite. Cette page contient un tas d'animations java des différents comportements et de ce qu'ils font. Il existe plusieurs implémentations open source de comportements de pilotage. En voici un.

Tetrad
la source
Les comportements de pilotage sont parfaits pour cela.
tenpn
2

Une chose facile à essayer est d'avoir un point invisible qui précède le point noir et exécute le chemin dans votre première image. Le point noir suit ensuite le point invisible à une petite distance derrière.
J'ai vu ce travail avec de bons résultats, mais bien sûr, il pourrait ne pas répondre à vos besoins.

Paulo Pinto
la source