El audio es un elemento crucial de la experiencia de juego en general, y GameMaker: Studio proporciona una forma relativamente simple para que implementes audio 3D en tus proyectos.
Para comprender mejor el concepto de audio 3D, imagínese agregar un par de orejas digitales a un objeto de juego controlado por el jugador. Cuando el jugador se acerca a una fuente de sonido dentro del juego, el volumen de esa fuente se vuelve más alto; a medida que el jugador se aleja, el volumen disminuye hasta que finalmente queda en silencio. La posición del reproductor en relación con la fuente de audio también dará como resultado un 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 características 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 incorporan audio 3D de diferentes maneras, como se ve en el video de demostración. Puede descargar los archivos de origen y la demo EXE compilada desde GitHub.
Los conceptos involucrados en el audio 3D son similares en todos los entornos de desarrollo de juegos, ya que se basan en reglas familiares del mundo real: el sonido se vuelve más fuerte a medida que se acerca a la fuente, y el sonido que se origina a su derecha será más fuerte en su oído derecho. Estos principios básicos pueden lograrse manualmente calculando la ganancia y 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 de audio actúa como la 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)
eso puede ser cualquiera estático o dinámica. El volumen del emisor está controlado por ganancia y caerse valores, y los efectos en tiempo real se pueden aplicar a través de la tono y velocidad valores. La forma en que el emisor maneja la caída del audio está determinada por el modelo de distancia aplicado. Múltiples emisores de audio pueden existir dentro de la misma escena..
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ático o dinámico, 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 del oyente predeterminado en GameMaker: Studio hace que los canales de audio izquierdo y derecho se inviertan para el audio 3D, que corregiremos más adelante durante la implementación.
Sin entrar en una explicación larga y completa del efecto Doppler, puede describirse como el cambio en la frecuencia del sonido en relación con el movimiento y la velocidad del emisor o oyente. En GameMaker: Studio, el efecto Doppler se logra asignando vectores a la velocidad del emisor de audio o el oyente. Para una explicación detallada, lea la entrada del efecto Doppler en Wikipedia.
La implementación de audio en 3D en su proyecto GameMaker es un proceso de tres pasos. Debe definir correctamente el emisor dentro de un objeto de juego existente, colocarlo en la sala 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 sala que el emisor..
El primer paso, sin embargo, implica importar y definir los recursos de audio.
Comience haciendo clic en Recursos en la barra de herramientas principal de GameMaker y seleccionando Crear sonido desde el menú desplegable. Ingrese un nombre para el activo de sonido y seleccione los atributos de sonido deseados para transmisión y compresión de archivos. Luego, en el Opciones de destino sección de la Propiedades del sonido ventana, haga clic en el primer menú desplegable y seleccione 3D de la lista de opciones.
Al designar este activo como un sonido 3D, podemos aprovechar la API de audio de GameMaker de maneras únicas.En nuestro primer ejemplo, crearemos una especie de instancia isométrica del estilo de Sim City de audio 3D con un emisor estacionario. Nuestro oyente estará vinculado a un objeto del 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 ambiental de la ciudad con un tráfico bullicioso y bocinas de automóviles..
Esto nos permitirá probar las propiedades de caída del audio del sistema de audio 3D, y podremos entender mejor la importancia de la orientación del oyente..
Nuestro oyente de audio 3D existirá dentro de un objeto que sigue el cursor del mouse. En este ejemplo, el objeto será identificado por un sprite que se asemeja a un marcador GPS. los obj_listener
objeto contiene dos bloques de código importantes: uno en el Crear
evento, y uno en el Paso
evento.
Haga clic en el Añadir evento botón y seleccione Crear para agregar un Crear
evento a obj_listener
. Arrastrar el Ejecutar Código icono de la Controlar pestaña de la obj_listener
ventana de propiedades en el Comportamiento sección de la Crear evento panel. Haga doble clic en Ejecutar Código para abrir el editor de código GML y agregar la siguiente línea de código:
audio_listener_orientation (0,1,0,0,0,1);
Este código garantiza que, tan pronto como se cree el objeto de escucha, se posicionará en el espacio 3D para mirar. hacia La pantalla, derecha-arriba. El audio proveniente de un emisor ubicado a la derecha del oyente estará más presente en el altavoz derecho, y viceversa. Esta es la configuración estándar que querrá usar en casi todos los tipos de implementación de oyentes en GameMaker: Studio.
Si quisiera que se intercambiara el audio izquierdo y derecho, usaría el siguiente código para la orientación:
audio_listener_orientation (0,1,0,0,0, -1);
Agrega un Paso
evento a obj_listener
y arrastra otro Ejecutar Código icono en el Comportamiento panel. Abra el editor de código GML una vez más e ingrese las siguientes líneas de código:
x = mouse_x; y = mouse_y; 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 cursor. obj_listener
objeto. La posición del oyente de audio también está definida por estas coordenadas. Al colocar este código en la Paso
evento, nos aseguramos de que el obj_listener
El objeto, el sprite que lo acompaña y el oyente están siempre en la misma ubicación, ya que Paso
El código de evento se ejecuta en cada fotograma durante el tiempo de ejecución.
(Los 0
en este código está 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 sala donde desea que aparezca el objeto de escucha. Haga clic en el Objetos y haga clic dentro del panel para mostrar la lista de objetos disponibles. Seleccione su objeto de oyente y haga clic dentro de la sala para colocarlo. La posición inicial de este objeto no importa, ya que se actualizará para que coincida 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 el oyente oiga.
Al igual que con el oyente, nos centraremos exclusivamente en el Crear
y Paso
Eventos del objeto emisor. En este caso, colocaremos el emisor en el obj_city
objeto.
Añade el Crear
y Paso
eventos a obj_city
,y agrega un Ejecutar Código acción a ambos eventos.
En el código GML de la Crear
evento, agregue lo siguiente:
s_emit = audio_emitter_create (); audio_falloff_set_model (audio_falloff_exponent_distance); audio_emitter_falloff (s_emit, 50, 200, 1); audio_play_sound_on (s_emit, snd_cityaudio, true, 1);
(s_emit
es el nombre de nuestro nuevo emisor.)
Elegimos el Distancia exponencial modelo de caída para este ejemplo, ya que proporciona una caída constante de ganancia con un aumento brusco una vez que cumple con el Distancia de referencia punto. Esto permite que el volumen de audio 3D disminuya a medida que se aleja del objeto, sin problemas, sin saltos bruscos, hasta que se acerque mucho a la fuente. Para obtener una lista completa de los modelos falloff y sus descripciones detalladas, lea la documentación de los modelos falloff de GameMaker..
audio_emitter_falloff (emisor, falloff_ref, falloff_max, falloff_factor)
Es donde configuramos los atributos del modelo de caída:
emisor
es nuestro s_emit
variable. 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.factor de caída
es un numero usado en el audio_falloff_set_model
Cálculo para determinar los resultados de la caída. En nuestro ejemplo, usamos el valor predeterminado de 1
para que nuestro s_emit
el emisor comenzará a caerse 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 más.audio_play_sound_on (emisor, sonido, bucle, prioridad)
Así es como conseguimos que el emisor comience a reproducir nuestro sonido 3D:
emisor
es nuestro s_emit
variable. sonar
es nuestro snd_cityaudio
Activo de audio 3D que importamos anteriormente. lazo
Determina si este sonido debe repetirse o no.. prioridad
es un valor de 0
a 100
eso 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 que se reproduce, por lo que la prioridad no importa. Y como este código se ejecuta en el Crear
evento y hemos elegido hacer un bucle con el sonido, este recurso de audio 3D se reproducirá tan pronto como se cargue la sala, y continuará reproduciéndose hasta que se le indique que se detenga. Y eso nos lleva a una muy paso importante:
Este activo de audio se reproducirá. Incluso cuando carga otra sala que no contiene el emisor. Para poder detener este activo de forma efectiva en cualquier sala que no sea la sala que contiene el emisor, debemos agregar un Fin de habitacion
evento a obj_city
.
En el Comportamiento panel de la Fin de habitacion
evento, agrega otro Ejecutar Código Icono con el siguiente código GML:
sound_stop (snd_cityaudio);
Ahora todo lo que queda por hacer es colocar el obj_city
Objeto en la habitación como tú colocaste antes al oyente. 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.
En el segundo ejemplo, adjuntaremos el emisor a un objeto en movimiento y aplicaremos el efecto Doppler mientras usamos el mismo objeto de escucha que creamos anteriormente..
Un objeto de bala se está moviendo desde el lado derecho de la pantalla hacia la izquierda. Cuando la bala alcanza el borde de la pantalla, se enrolla y continúa desde donde comenzó. (No veremos cómo crear este movimiento). El objeto de bala emite un sonido de bucle que puede describirse como un sonido de "zumbido" o "zumbido". Cuando el objeto se acerca al oyente, el frecuencia El sonido cambiará, debido al efecto Doppler..
Agrega un Crear
y un Paso
evento a la obj_bullet
objeto, y añadir el Ejecutar Código acción a ambos eventos.
En el Crear
evento, agregue el siguiente código al editor de GML:
s_emit2 = audio_emitter_create (); audio_emitter_falloff (s_emit2, 25, 200, 1.5); 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 de caída definido en la sala anterior, ya que solo un tipo de modelo de caída 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 200
píxeles, y un factor de caída de 2.5
para el cálculo. los snd_bullet
El activo de sonido 3D comienza a reproducirse tan pronto como se crea el objeto, con una prioridad de 1
, y se repetirá indefinidamente.
En el editor de GML de la Paso
evento, agregue esta línea de código:
audio_emitter_position (s_emit2, x, y, 0);
Dado que el objeto se mueve y los valores de x e y 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 bala a la habitación y asegúrese de agregar el sound_stop (snd_bullet)
código para el objeto Fin de habitacion
evento.
El sistema de sonido 3D ya está instalado para el objeto de bala, y el oyente funciona correctamente, pero hagamos las cosas más interesantes con el efecto Doppler.
Agregar el efecto Doppler es muy simple, en realidad. Solo abre el Ejecutar Código acción en el obj_bullet
Crear
evento, y agregar la siguiente línea de código:
audio_emitter_velocity (s_emit2, -25, -25, 0);
audio_emitter_velocity (emisor, vx, vy, vz)
Nos permite definir las propiedades del efecto Doppler:
emisor
es nuestro s_emit 2
variable. 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 configurando esto 0
. Las configuraciones típicas de efectos Doppler utilizan el Hspeed
y vspeed
variables 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. Puedes probar el objeto con el siguiente código para notar la diferencia:
audio_emitter_velocity (s_emit2, hspeed, vspeed, 0);
El audio 3D puede agregar mucha profundidad y ambiente a su proyecto de juego, con el mínimo esfuerzo requerido. Aquí hay algunos ejemplos para comenzar: