¿Cómo agregar un sonido que una IA enemiga puede escuchar?

10

Dado:

  • un juego 2D de arriba hacia abajo
  • Los mosaicos se almacenan solo en una matriz 2D
  • Cada ficha tiene una propiedad: humedecer (por lo que los ladrillos pueden ser -50db, el aire puede ser -1)

A partir de esto, quiero agregarlo para que se genere un sonido en el punto x1, y1 y se "ondule". La imagen a continuación lo describe mejor. Obviamente, el objetivo final es que el enemigo de la IA pueda "escuchar" el sonido, pero si una pared lo bloquea, el sonido no llega tan lejos.

ingrese la descripción de la imagen aquí

El rojo es el muro, que tiene una amortiguación de 50db.

Creo que en la marca del tercer juego estoy confundiendo mis matemáticas.

¿Cuál sería la mejor manera de implementar esto?

Chris
fuente
1
¿Te importa el sonido que refleja / reverbera? Es decir, si una sección de la pared insonorizada está directamente entre la fuente de sonido y el agente de inteligencia artificial, pero la pared se puede caminar libremente, ¿el agente de inteligencia artificial aún debe escuchar el sonido? Si la respuesta es no, solo actualice cada celda una vez por sonido, por lo que la amortiguación solo se aplica una vez a cada fuente de sonido. Si solo tiene unos pocos agentes de IA, simplemente trace una línea desde el origen hasta el agente.
Sean Middleditch
El objetivo es tener muchos agentes 'estúpidos' que sigan tus sonidos alrededor de las paredes y lo que no.
Chris

Respuestas:

7

Parece una idea razonable, recuerde, esta es una característica de juego, no lo haga más complicado de lo que se requiere para el juego.

Cambiaría su esquema para que el sonido se propague de inmediato, ya que probablemente sea más fácil de programar y parezca más consistente con la rápida propagación del sonido real.

Esto es esencialmente un problema de búsqueda de caminos, y probablemente se resuelva mejor usando el algoritmo de Dijkstra. Esta es una búsqueda de uno a muchos puntos (una fuente de sonido, múltiples enemigos), y como tal se puede resolver de manera eficiente comenzando en el punto único.

Comienza haciendo un spread desde la fuente y marca todos los vecinos que aún no han sido marcados y tienen un volumen calculado por encima de 0, cada uno de esos vecinos que agregas a una lista. Esa lista debe ordenarse por volumen calculado. Luego repite el proceso para la entrada de mayor volumen en la lista, agregando nuevas entradas a la lista según sea necesario y eliminando la que ha manejado. Repita hasta que la lista esté vacía.

Siempre que durante este proceso alcances un mosaico con un enemigo, sabes qué volumen escucha ese enemigo.

aaaaaaaaaaaa
fuente
1
+1 para un viaje de sonido inmediato. A menos que esté haciendo una simulación física que se preocupe por esas cosas, KISS.
Hackworth
Hmmm suena muy bien. También estoy de acuerdo con @Hackworth en mantenerlo simple. El sonido inmediato fue un momento de 'centavo ha caído' en el momento en que fue mencionado. He comenzado a leer sobre el algoritmo de Dijkstra, pero solo para confirmar, ¿puede incluir nodos ponderados para ajustar para diferentes tipos de paredes?
Chris
@Chris Sí, Dijkstra también funciona con nodos ponderados que serían una buena forma de modelar paredes (por ejemplo, el peso disminuirá el volumen, etc.)
bummzack
9

No creo que sea necesario encontrar un camino, solo haz rayos a cada IA ​​en el área, si hay un muro en el camino, no lo escuchan. Esto funcionaría mejor con algún tipo de gráfico de escena + partición espacial

CobaltHex
fuente
Estoy de acuerdo con esta respuesta
bobobobo 01 de
Esa estructura de datos para almacenar el sonido también será mucho más simple de esta manera.
Chris
Me gusta la idea de un rayo, pero no sé si eso explicaría el sonido que pasa a través de diferentes tipos de paredes. Por ejemplo, un pequeño sonido de paso de pie no atravesaría la pared, pero sí el sonido de un disparo de arma. Pero en este caso, no sé si el casting de rayos resolvería esas situaciones
Chris
1
Chris, solo toma la idea de Raycast y amplía un poco. Cada vez que el rayo se cruza con un objeto, reduce el volumen del sonido en cierta cantidad. Si el volumen se reduce a cero antes de llegar a la IA, no se escucha. Si llega a la IA, entonces tienes un valor de "volumen" en la mano. También puede usar este tipo de "trazo de rayo con reducción de volumen" para aplicar una caída de sonido a distancia.
Tim Holt
@Tim Holt - buen punto, no estaba pensando en ese sentido
Chris
0

Creo que su implementación supone que el nivel de sonido en una celda es acumulativo, y que la amplitud simplemente se mueve hacia afuera de manera uniforme en todas las direcciones. El sonido no se extiende, cuadro por cuadro, se está reproduciendo o no, y desea conocer la amplitud para reproducirlo en cualquier punto dado.

Raycasting a través de los mosaicos es una forma (y probablemente la más efectiva) de hacerlo. Simplemente dibuje una línea entre el emisor y el receptor, y reste el valor de amortiguación de cada celda en el camino. Si el número es positivo, reproduces el sonido.

Si desea modelar sonido indirecto, entonces tendrá que buscar el camino. Trate al emisor como la raíz de su árbol y modele cada celda adyacente como un nodo vinculado. Cada enlace tiene un costo, restado del volumen actual. Siga atravesando el gráfico hasta que encuentre el receptor o su volumen caiga por debajo de cero (si lo hace, retroceda e intente otra ruta). Si no hay rutas al receptor con un volumen positivo, no se puede escuchar su emisor. NB: no puede simplemente abandonar el recorrido cuando encuentra el receptor, porque puede haber múltiples rutas de emisor a receptor, y necesita la que tenga el volumen más alto.

Si está modelando una IA que se preocupa por el origen del sonido, el último enfoque ayudará: una IA estaría 'escuchando' el sonido proveniente de la dirección del último segmento en el camino. Bien, si hay dos rutas audibles hacia el receptor, la IA podría confundirse sobre los múltiples sonidos y qué dirección tomar.

MrCranky
fuente
1
El sonido es una onda transmitida a través del fluido. Puede que no sea apropiado simularlo de esa manera en un juego, pero ciertamente "no es así como funciona el sonido".
Kevin Reid
Punto justo, editado
MrCranky el