Entendiendo e Implementando un Audio 3D en GameMaker Studio
() translation by (you can also view the original English article)
El audio es un elemento crucial de la experiencia general de juego, y GameMaker: Studio proporciona una forma relativamente simple de implementar audio 3D en sus proyectos.
Para comprender mejor el concepto de audio 3D, imagínese agregar un par de oídos digitales a un objeto de juego controlado por el jugador. A medida que el jugador se acerca a una fuente de sonido dentro del juego, el volumen de esa fuente aumenta de volumen; a medida que el jugador se aleja, el volumen disminuye hasta que finalmente se silencia. La posición del reproductor en relación con la fuente de audio también dará como resultado audio estéreo direccional, y la velocidad del sonido aplicada a un objeto en movimiento se puede aplicar para crear un efecto Doppler.
Este conjunto de funciones de audio inmersivo se puede lograr a través de un sistema de emisores de audio y un oyente de audio. En este tutorial, crearemos dos escenas que incorporen audio 3D de diferentes maneras, como se ve en el video de demostración. Puede descargar los archivos fuente y el EXE de demostración compilado de GitHub.
Entendiendo el Audio 3D
Los conceptos relacionados con el audio 3D son similares en todos los entornos de desarrollo de juegos, ya que se basan en reglas familiares reales: el sonido se vuelve más fuerte a medida que se acerca a la fuente y el sonido que se origina en la derecha será más fuerte en el oído derecho. Estos principios básicos se pueden lograr manualmente calculando la ganancia y la salida de una fuente de audio en relación con un objeto de juego específico, pero GameMaker: Studio proporciona un conjunto de funciones potentes y fáciles de usar que le dan control directo de la API de audio .
El Emisor
El emisor de audio actúa como fuente de un activo de sonido 3D en GameMaker: Studio. El emisor está definido por una variable creada por el usuario y una posición (x, y, z)
que puede ser estática o dinámica. El volumen del emisor se controla mediante valores de ganancia y disminución, y los efectos en tiempo real se pueden aplicar a través de los valores de tono y velocidad. La forma en que el emisor maneja la caída del audio está determinada por el modelo de distancia aplicado. Pueden existir múltiples emisores de audio dentro de la misma escena.
El Oyente
El oyente de audio actúa como los "oídos" que reciben el sonido 3D enviado por el emisor. El oyente se encuentra en una posición (x, y, z)
que también puede ser estática o dinámica, pero la orientación del oyente es igual de importante.
La orientación del oyente determina la dirección y el ángulo precisos que el oyente está "mirando". La orientación de oyente predeterminada en GameMaker: Studio da como resultado que los canales de audio izquierdo y derecho se inviertan para Audio 3D, que corregiremos más adelante durante la implementación.
El Efecto Doppler
Sin entrar en una explicación extensa y completa del efecto Doppler, se puede describir como el cambio en la frecuencia del sonido en relación con el movimiento y la velocidad del emisor o del oyente. En GameMaker: Studio, el efecto Doppler se logra asignando vectores a la velocidad del emisor o el oyente de audio. Para una explicación en profundidad, lea la entrada del efecto Doppler en Wikipedia.
Implementando el Audio 3D
Implementar el audio 3D en tu proyecto GameMaker es un proceso de tres pasos. Debe definir correctamente el emisor dentro de un objeto de juego existente, colocar este objeto en la habitación y decirle al emisor cuándo y cómo reproducir un sonido. Luego debe definir la orientación y la posición del oyente dentro de un objeto de juego existente que está presente en la misma habitación que el emisor.
El primer paso, sin embargo, implica la importación y definición de los activos de audio.
Importación de Activos
Comience haciendo clic en Recursos en la barra de herramientas principal de GameMaker y seleccione Crear sonido en el menú desplegable. Ingrese un nombre para el activo de sonido y seleccione los atributos de sonido deseados para la transmisión y la compresión de archivos. Luego, en la sección Opciones de Destino de la ventana Propiedades del Sonido, haga clic en el primer menú desplegable y seleccione 3D de la lista de opciones.



Un Emisor Estacionario
En nuestro primer ejemplo, crearemos un tipo de instancia simétrica de audio en 3D estilo Sim City con un emisor estacionario. Nuestro oyente estará vinculado a un objeto de juego que sigue al cursor del mouse, y el emisor del sonido 3D permanecerá dentro de un objeto que no se mueve. Este objeto estará representado por un pequeño grupo de edificios, y el emisor reproducirá un sonido ambient city-scape con tráfico bullicioso y bocinas de automóviles.



Esto nos permitirá probar las propiedades de caída de audio del sistema de audio 3D, y podremos entender mejor la importancia de la orientación del oyente.
Creando el Oyente
Nuestro oyente de audio 3D existirá dentro de un objeto que sigue al cursor del mouse. En este ejemplo, el objeto será identificado por un objeto que se asemeja a un marcador de GPS. El objeto obj_listener
contiene dos bloques de código importantes: uno en el evento Crear
y otro en el evento Paso
.



Haga clic en el botón Agregar Evento y seleccione Crear
para agregar un evento Crear a obj_listener
. Arrastre el icono Ejecutar Código desde la pestaña Control de la ventana de propiedades obj_listener
a la sección Acciones del panel Crear evento. Haga doble clic en el icono Ejecutar Código para abrir el editor de código GML y agregue la siguiente línea de código:
1 |
audio_listener_orientation(0,1,0,0,0,1); |
Este código asegura que, tan pronto como se crea el objeto oyente, se colocará en el espacio 3D para mirar hacia la pantalla, con el lado derecho hacia arriba. El audio procedente de un emisor situado a la derecha del oyente estará más presente en el altavoz derecho, y viceversa. Esta es la configuración estándar que deseará usar en casi todos los tipos de implementación de escucha en GameMaker: Studio.
Si desea que el audio izquierdo y derecho se intercambie, entonces usaría el siguiente código para la orientación:
1 |
audio_listener_orientation(0,1,0,0,0,-1); |
Agregue un evento Paso
a obj_listener
y arrastre otro icono Ejecutar Código en el panel Acciones. Abra el editor de código GML una vez más e ingrese las siguientes líneas de código:
1 |
x = mouse_x; |
2 |
y = mouse_y; |
3 |
audio_listener_position(x, y, 0); |
Este código encuentra la ubicación actual del cursor del mouse y asigna estas coordenadas a la posición del objeto obj_listener
. La posición del oyente de audio también está definida por estas coordenadas. Al colocar este código en el evento Paso
, nos aseguramos de que el objeto obj_listener
, su sprite acompañante y el oyente estén siempre en la misma ubicación, ya que el código del evento Paso
se ejecuta en cada fotograma durante el tiempo de ejecución.
(El 0
en este código es la posición z del oyente. Dado que nuestro juego está en 2D, nuestro oyente siempre estará en 0
en el eje z).



Abra la habitación donde desea que aparezca el objeto oyente. Haga clic en la pestaña Objetos y haga clic dentro del panel para visualizar la lista de objetos disponibles. Seleccione su objeto detector y haga clic dentro de la habitación para colocarlo. La posición de inicio de este objeto no importa, ya que se actualizará para coincidir con la posición del cursor del mouse en el tiempo de ejecución.
Eso es todo para el oyente. Ahora tenemos que crear algo para que lo oiga el oyente.
Creando el Emisor
Al igual que con el oyente, nos centraremos exclusivamente en los eventos Crear
y Paso
del objeto emisor. En este caso, colocaremos el emisor en el objeto obj_city.
Agregue los eventos Crear
y Pasar
a obj_city
y agregue una acción Ejecutar Código a ambos eventos.



En el código GML del evento Crear
, agregue lo siguiente:
1 |
s_emit = audio_emitter_create(); |
2 |
audio_falloff_set_model(audio_falloff_exponent_distance); |
3 |
audio_emitter_falloff(s_emit, 50, 200, 1); |
4 |
audio_play_sound_on(s_emit, snd_cityaudio, true, 1); |
(s_emit
es el nombre de nuestro nuevo emisor).
Elegimos el modelo de Caída Exponencial de la distancia para este ejemplo porque da una disminución constante de la ganancia con un fuerte aumento una vez que se encuentra con el punto de Distancia de Referencia. Esto permite que el volumen de audio 3D disminuya a medida que te alejas del objeto, suavemente, sin saltos bruscos, hasta que te acercas mucho a la fuente. Para obtener una lista completa de los modelos Falloff y sus descripciones en profundidad, lea la documentación de los modelos falloff de GameMaker.
audio_emitter_falloff (emitter, falloff_ref, falloff_max, falloff_factor)
es donde configuramos los atributos del modelo falloff:
-
emisor
es nuestra variables_emit.
-
falloff_ref
es el punto en el que comenzará la caída del volumen. -
falloff_max
es el punto en el que el oyente ya no podrá escuchar el emisor. -
falloff_factor
es un número utilizado en el cálculo deaudio_falloff_set_model
para determinar los resultados de la caída. En nuestro ejemplo, usamos el valor predeterminado de1
para que nuestro emisors_emit
comience a caer una vez que el oyente esté a 100 píxeles del emisor, y el oyente no podrá escuchar el emisor a una distancia de 300 píxeles o superior. .
audio_play_sound_on (emitter, sound, loop, priority)
es la forma en que hacemos que el emisor comience a reproducir nuestro sonido 3D:
-
emisor
es nuestra variables_emit
. - el
sonido
es nuestro activo de audio 3Dsnd_cityaudio
que importamos anteriormente. -
loop
determina si este sonido debería repetirse o no. - la
prioridad
es un valor de0
a100
que determina la 'importancia' del sonido que se está reproduciendo; los números más grandes representan sonidos de mayor prioridad.
En nuestro ejemplo, solo tenemos un sonido en reproducción, por lo que la prioridad no importa. Y dado que este código se ejecuta en el evento Crear
y elegimos reproducir el sonido, este activo de audio 3D se reproducirá tan pronto como se cargue la habitación, y continuará reproduciéndose hasta que se le indique que se detenga. Y eso nos lleva a un paso muy importante:
Este activo de audio se reproducirá incluso cuando cargue otra habitación que no contenga el emisor. Para detener eficazmente la reproducción de este activo en cualquier sala que no sea la habitación que contiene el emisor, debemos agregar un evento de Room End
a obj_city
.



En el panel Acciones del evento Room End
, agregue otro icono Ejecutar Código con el siguiente código GML:
1 |
sound_stop(snd_cityaudio); |
Ahora todo lo que queda por hacer es colocar el objeto obj_city
en la sala como lo hiciste anteriormente. Ejecute el juego y experimente con la posición del cursor del mouse para cambiar la ubicación del oyente en relación con el emisor para ver exactamente cómo funciona el audio 3D en la práctica.
Un Emisor Móvil con el Efecto Doppler
En el segundo ejemplo, conectaremos el emisor a un objeto en movimiento y aplicaremos el efecto Doppler mientras usamos el mismo objeto oyente que creamos anteriormente.
Un objeto de bala se mueve desde el lado derecho de la pantalla hacia la izquierda. Cuando la bala alcanza el borde de la pantalla, se envuelve y continúa desde donde comenzó. (No veremos cómo crear este movimiento). El objeto de bala emite un sonido de bucle que se puede describir como un sonido de "zumbido" o "zumbido". Cuando el objeto se acerca al oyente, la frecuencia del sonido cambiará debido al efecto Doppler.
Creando el Emisor
Agregue un evento Crear
y un Paso
al objeto obj_bullet
y agregue la acción Ejecutar Código a ambos eventos.
En el evento Crear
, agregue el siguiente código al editor GML:
1 |
s_emit2 = audio_emitter_create(); |
2 |
audio_emitter_falloff(s_emit2, 25, 200, 1.5); |
3 |
audio_play_sound_on(s_emit2, snd_bullet, true, 1); |
Aquí, s_emit2
es el nombre de nuestro nuevo emisor.
Este emisor utilizará el mismo modelo falloff definido en la sala anterior, ya que solo un tipo de modelo falloff puede estar activo a la vez, y nuestro modelo original es adecuado para este ejemplo. Las nuevas propiedades de caída utilizan una referencia de caída de 25
píxeles, un máximo de caída de 200
píxeles y un factor de caída de 2.5
para el cálculo. El activo de sonido 3D snd_bullet
comienza a reproducirse tan pronto como se crea el objeto, con una prioridad de 1
, y se repetirá indefinidamente.



En el editor GML del evento Paso
, agregue esta línea de código:
1 |
audio_emitter_position(s_emit2, x, y, 0); |
Como el objeto se mueve y los valores xey cambian constantemente, la posición del emisor también se actualizará a la nueva posición en cada paso.
No olvide agregar el objeto de viñeta a la sala y asegúrese de agregar el código sound_stop (snd_bullet)
al evento Room End
del objeto.
Creando el Efecto Doppler
El sistema de sonido 3D está ahora en su lugar para el objeto bala, y el oyente funciona correctamente, pero vamos a hacer las cosas más interesantes con el efecto Doppler.
Agregar el efecto Doppler es muy simple, en realidad. Simplemente abra la acción Ejecutar Código en el evento obj_bullet
Crear
y agregue la siguiente línea de código:
1 |
audio_emitter_velocity(s_emit2, -25, -25, 0); |
audio_emitter_velocity (emitter, vx, vy, vz)
nos permite definir las propiedades del efecto Doppler:
-
emisor
es nuestra variables_emit 2
. -
vx
es la velocidad (en píxeles por paso) a lo largo del eje x. -
vy
es la velocidad (en píxeles por paso) a lo largo del eje y. -
vz
se aplica a la velocidad a lo largo del eje z, pero nuestro juego está en 2D, por lo que estamos estableciendo esto en0
.
Las configuraciones típicas del efecto Doppler usan las variables hspeed
y vspeed
de un objeto para determinar los valores de velocidad, pero en este caso, solo usamos un valor de -25
para crear un sonido de bala más realista. Puede probar el objeto con el siguiente código para notar la diferencia:
1 |
audio_emitter_velocity(s_emit2, hspeed, vspeed, 0); |
Implementación de Ideas
El audio 3D puede agregar una gran cantidad de profundidad y ambiente a su proyecto de juego, con un mínimo esfuerzo requerido. Estos son solo algunos ejemplos para comenzar:
- Un juego de escondidas donde tienes que escuchar pistas de audio para encontrar un objeto escondido.
- Riesgos de electricidad o incendio en un juego de plataformas que le advierten de los peligros a medida que se acerca.
- Un juego al estilo de Frogger donde los autos te sobrepasan utilizando el efecto Doppler.
- Agua corriente en una cueva o viento que sopla a través de un conducto de aire para llevarlo a la salida.
- Un juego de espionaje donde tienes que acercarte a un objetivo para escuchar una conversación.