Comment ajouter un son qu'une IA ennemie peut entendre?

10

Donné:

  • un jeu 2D top down
  • Les tuiles sont stockées uniquement dans un tableau 2D
  • Chaque tuile a une propriété - amortir (donc les briques peuvent être -50db, l'air peut être -1)

À partir de cela, je veux l'ajouter pour qu'un son soit généré au point x1, y1 et qu'il "ondule". L'image ci-dessous le décrit mieux. De toute évidence, l'objectif final est que l'ennemi IA puisse "entendre" le son - mais si un mur le bloque, le son ne se déplace pas aussi loin.

entrez la description de l'image ici

Le rouge est le mur, qui a un amortissement de 50 dB.

Je pense que dans la troisième partie, je confond mes calculs.

Quelle serait la meilleure façon de mettre cela en œuvre?

Chris
la source
1
Vous souciez-vous du son réfléchissant / réverbérant du tout? Autrement dit, si une section de mur insonorisé se trouve directement entre la source sonore et l'agent AI, mais que le mur peut circuler librement, l'agent AI devrait-il toujours entendre le son? Si la réponse est non, ne mettez à jour chaque cellule qu'une fois par son, de sorte que l'atténuation n'est appliquée qu'une seule fois à chaque source sonore. Si vous ne disposez que de quelques agents IA, tracez simplement une ligne de la source à l'agent.
Sean Middleditch du
Le but est d'avoir de nombreux agents «stupides» suivant vos sons autour des murs et quoi d'autre.
Chris

Réponses:

7

Cela semble être une idée raisonnable, rappelez-vous cependant, c'est une fonctionnalité de gameplay, ne la rendez pas plus compliquée que ce qui est requis pour le gameplay.

Je changerais votre schéma pour que le son se propage immédiatement, car c'est probablement plus facile à programmer et semble plus cohérent avec la propagation rapide du son réel.

Il s'agit essentiellement d'un problème d'orientation, et il est probablement préférable de le résoudre en utilisant l'algorithme de Dijkstra. Il s'agit d'une recherche de point un à plusieurs (une source sonore, plusieurs ennemis) et, en tant que telle, peut être résolue efficacement en commençant au point unique.

Vous commencez par faire une propagation à partir de la source et marquez tous les voisins qui n'ont pas encore été marqués et dont le volume calculé est supérieur à 0, chacun de ces voisins que vous ajoutez à une liste. Cette liste doit être triée par volume calculé. Ensuite, vous répétez le processus pour l'entrée de volume le plus élevé de la liste, en ajoutant de nouvelles entrées à la liste si nécessaire et en supprimant celle que vous avez gérée. Répétez jusqu'à ce que la liste soit vide.

Chaque fois que vous atteignez une tuile avec un ennemi pendant ce processus, vous savez quel volume cet ennemi entend.

aaaaaaaaaaaa
la source
1
+1 pour un voyage sonore immédiat. Sauf si vous faites une simulation physique qui se soucie de ce genre de choses, KISS.
Hackworth
Hmmm sonne vraiment bien. Je suis également d'accord avec @Hackworth sur la simplicité. Le son immédiat était un tel «penny a chuté» à la minute où il a été mentionné. J'ai commencé à lire sur l'algorithme de Dijkstra, mais juste pour confirmer, il peut inclure des nœuds pondérés pour s'adapter à différents types de murs?
Chris
@Chris Oui, Dijkstra fonctionne également avec des nœuds pondérés, ce qui serait un bon moyen de modéliser les murs (par exemple, le poids diminuera le volume, etc.)
bummzack
9

Je ne pense pas qu'un localisateur de chemin soit nécessaire, il suffit de lancer des rayons sur chaque IA de la zone, s'il y a un mur sur le chemin, ils ne l'entendent pas. Cela fonctionnerait mieux avec une sorte de graphe de scène + partitionnement spatial

CobaltHex
la source
Je suis d'accord avec cette réponse.
bobobobo
Cette structure de données pour stocker le son sera également beaucoup plus simple.
Chris
J'aime l'idée d'un lancer de rayons, mais je ne sais pas si cela expliquerait le son traversant différents types de murs. Par exemple, un petit bruit de pas de pied ne passerait pas à travers le mur, mais le son d'un coup de feu le ferait. Mais dans ce cas, je ne sais pas si le lancer de rayons réglerait ces situations
Chris
1
Chris, prends juste l'idée de raycast et développe-la un peu. Chaque fois que le rayon croise un objet, il réduit le volume du son dans une certaine mesure. Si le volume est réduit à zéro avant d'atteindre l'IA, il n'est pas entendu. S'il atteint l'IA, alors vous avez en main une valeur de "volume". Vous pouvez également utiliser ce type de "trace de rayon avec réduction de volume" pour appliquer une perte de son sur la distance.
Tim Holt du
@ Tim Holt - bon point, je ne pensais pas dans ce sens
Chris
0

Je pense que votre implémentation suppose que le niveau sonore dans une cellule est cumulatif, et que l'amplitude se déplace simplement vers l'extérieur uniformément dans toutes les directions. Le son ne se propage pas, image par image, il est en train de jouer ou non, et vous voulez connaître l'amplitude pour le jouer à un moment donné.

La diffusion de rayons à travers les carreaux est un moyen (et probablement le plus efficace) de le faire. Il suffit de tracer une ligne entre l'émetteur et le récepteur et de soustraire la valeur d'amortissement de chaque cellule en cours de route. Si le nombre est positif, vous jouez le son.

Si vous souhaitez modéliser un son indirect, vous devrez rechercher un chemin. Traitez l'émetteur comme la racine de votre arbre et modélisez chaque cellule adjacente comme un nœud lié. Chaque lien a un coût, soustrait du volume actuel. Continuez à parcourir le graphique jusqu'à ce que vous trouviez le récepteur ou que votre volume tombe en dessous de zéro (si c'est le cas, revenez en arrière et essayez un autre chemin). S'il n'y a aucun chemin vers le récepteur avec un volume positif, votre émetteur ne peut pas être entendu. NB: vous ne pouvez pas simplement abandonner la traversée lorsque vous trouvez le récepteur, car il peut y avoir plusieurs chemins de l'émetteur au récepteur, et vous avez besoin de celui avec le volume le plus élevé.

Si vous modélisez l'IA qui se soucie de la provenance du son, cette dernière approche vous aidera - une IA `` entendrait '' le son provenir de la direction du dernier segment sur le chemin. Eh bien, s'il y a deux chemins audibles vers le récepteur, ils peuvent être confus sur les multiples sons et la direction à prendre.

MrCranky
la source
1
Le son est une onde transmise par le fluide. Il n'est peut-être pas approprié de le simuler de cette façon dans un jeu, mais ce n'est certainement pas "pas la façon dont le son fonctionne".
Kevin Reid
Fair point, édité
MrCranky