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.
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?
Respuestas:
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.
fuente
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
fuente
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.
fuente