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.
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?
Réponses:
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.
la source
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
la source
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.
la source