Existe-t-il un moyen simple d'arrêter les ennemis au même endroit?

24

Donc: jeu de haut en bas, mes ennemis pourchassent le joueur, quand ils arrivent à une certaine distance, ils restent immobiles et tirent. S'ils viennent tous de la même direction, ils finissent tous par se tenir au même endroit (c'est-à-dire qu'ils se tiennent «l'un dans l'autre»), car je ne fais pas actuellement de détection de collision entre ennemis - ils sont libres de passer les uns sur les autres.

Quel est un moyen simple de contourner cela? Soit une forme de détection de collision, soit une IA?

Iain
la source
1
Limitez-vous à un seul ennemi. : P
Kylotan

Réponses:

18

Vous n'avez pas besoin de détection de collision, mais vous devrez donner à vos ennemis un peu d'intelligence et les faire éviter de se heurter les uns aux autres. La détection de collision sans cela ne fera que rendre vos ennemis stupides de toute façon - les gens s'évitent, ils ne se heurtent généralement pas.

Recherchez "flocage" pour certains comportements simples.

L'idée de base est que les choses doivent se diriger vers le joueur, mais loin d'un obstacle proche (les uns des autres, les murs, ce genre de choses).

JasonD
la source
6
Cela s'appelle aussi appelé boids. Pour en savoir plus sur les règles simples entourant les boids, cliquez ici: en.wikipedia.org/wiki/Boids Devrait être trivial de mettre en œuvre ces restrictions.
Nailer
12

Vous pouvez vous inspirer sur les comportements de flocage , tels que les Boids .

Celles-ci ont tendance à consister en 3-4 règles très simples qui, appliquées correctement, conduisent à des comportements très satisfaisants et "d'apparence complexe".

Dans votre cas, vous pouvez essayer quelque chose comme ceci:

  • Séparation (rayons minimun entre les ennemis)
  • Cohésion (donc ils voyagent en groupe)
  • Alignement (donc ils ont tendance à se déplacer dans la même direction)
  • Ciblé (ils devraient avoir tendance à se déplacer vers le joueur)
egarcia
la source
Ceci est presque une copie textuelle de la réponse de JasonD. Je jure que je ne l'ai pas regardé avant de poster.
egarcia
3

Vous voudrez peut-être consulter la diffusion collaborative (de superbes animations ici) ou un autre type de motif anti-objet pour le mouvement. Bien que l'algorithme de diffusion en soi ne puisse pas empêcher les ennemis de traverser, vous pouvez ajouter des contraintes supplémentaires pour le rendre peu probable ou impossible.

maigre
la source
Divulgation complète: je suis sûr que j'ai trouvé le lien de diffusion collaborative ici quelque part sur GD, mais je ne peux pas pour la vie de trouver le poste qui s'y réfère maintenant. C'était tout à fait une trouvaille. =)
leander
C'est super génial mais j'ai un peu plus de complexité que ce dont j'avais besoin. Lire le livre blanc de toute façon, mais a réussi à mettre en œuvre une solution plus simple.
Iain
2

Et si vous refusez de passer par d'autres unités? Il me semble que vous en aurez besoin tôt ou tard. Chaque fois que le chemin actuel est bloqué par une unité, ajustez le chemin pour vous déplacer.

jmp97
la source
2

Il y a une référence pour les comportements de direction et de flocage sur le site Web de Craig Reynold . Ils sont relativement simples à mettre en œuvre mais peuvent produire de beaux comportements émergents.

tenpn
la source
C'est essentiellement la même réponse que les 2 autres, mais +1 pour le lien - Ce site Web est une très bonne référence.
AShelly
1

Toutes les autres réponses produisent un meilleur résultat, mais le moyen le moins cher (?) D'éviter le regroupement complet consiste à simplement ajouter un vecteur aléatoire qui représente peut-être 25% du vecteur de mouvement calculé d'origine afin que les objets rebondissent un peu dans un groupe d'objets blob généraux . Cela ne gardera pas les choses complètement éloignées les unes des autres, mais selon ce que vous essayez de réaliser, j'ai trouvé que cela pouvait être suffisant. Les objets peuvent toujours se regrouper avec cette méthode si vous faites des cercles autour d'eux, mais avec le temps, ils ont tendance à se diffuser.

Voici un petit jeu que j'ai fait il y a plusieurs années et qui illustre cette méthode: http://deleter.phatcode.net/index.php?page=projects&p=4

Deleter
la source
1

Les gens apportent toujours des boids car cela donne de très bons résultats, mais leur mise en œuvre peut être excessive pour votre objectif spécifique. Dans le passé, j'ai obtenu de très bons résultats en randomisant simplement la position cible dans un petit cercle.

Par exemple, pour une I démonstration construite à Unity I utilisé la commande Random.insideUnitSphere pour faire puffballs flocage

jhocking
la source
+1 Je suis d'accord, un autre exemple de cette stratégie (avec probablement une meilleure garantie de ne pas se chevaucher) peut être trouvé ici: Unités "Unclutter" dans le jeu RTS
MichaelHouse