rythm_game_tutorial_3

en Tutoriales, UE4

Juego de ritmo utilizando AudioAnalyzer (Parte 3)

Esta va a ser la última parte de esta serie de tutoriales que abordan la creación de un sencillo juego de ritmo. Aquí vamos a ver los detalles sobre la implementación del actor de juego principal y sus componentes.

Diseño y nivel principal
Interfaz de usuario
Game Actor

game_structure

Tenemos 3 blueprint de tipo actor. El primero de ellos (BP_Game) es el actor principal y se añádira al nivel justo delante de la cámara. Este blueprint contiene la interfaz de usuario y una instanci de otro actor blueprint (BP_Game_dealer), este actor es el encargado de generar las esferas que representarán los pulsos (BP_Game_dealer_beat)

BP_Game viewport

BP_Game_dealer se añade como Child Actor component de BP_Game. Para poder acceder a las funciones de esta componente tenemos que obtener el Child Actor y hacer un cast a BP_Game_Dealer

dealer_sat
SpawnNewBeat call from the BP_Game actor

En la sigueinte imagen tenemos una lista con las variables y funciones de nuestro actor principal. A continuación veremos algún detalle de las variables más interesantes.

BP_game_variables
BP_Game functions and variables

Player y Tracker solo son unas referencias a los objetos que están en el objeto de intancia de juego, solo para evitarnos estar haciendo el cast con cada acceso a estas variables. UI_Game es la instancia del widget de la interfaz de usuario creada en el tutorial anterior, podemos contruir y mostrarlo en el Event BeginPlay.

game_beginplay

Podemos inicializar ambos reproductores y el analizador de pulsos en este mismo punto también. Sólo queremos hacer el rastreo de pulsos en la banda de frecuencia 0-100Hz, por lo que necesitamos pasar un array 2D con un solo elemento con estos limites en la inicialización del analizador .

initialize_audio_analyzer

Básicamente la idea es generar la esfera del pulso unos pocos segundos antes de que suene por los altavoces, así el jugador puede ver como avanza por la pantalla hasta que alcanza el centro y la canción llega al punto exacto donde suena el pulso en ese mismo instante.

game_diagram

Por lo que tenemos dos variables importantes, el retardo entre las reproducciones del tracker y del player y la distancia entre el punto de aparición y el boton central del jugador. Ambas variables determinan la velocidad de movimiento de la esfera.

    \[ Velocidad\_esfera\_pulso = \frac{Distancia\_a\_origen}{Retardo\_reproduccion} \]

Cuando el contador de cuenta atrás llega a cero y el juego comienza tenemos que iniciar la reproducción del Tracker y el Player con una espera de 2 segundos.

start_playback_event

Vamos a utilizar Event Tick en cascada en vez de utilizarlos de manera independiente en cada uno de los 3 actores y sincronizarlos utilizando más variables. Con este método solo tendremos que pausar el Event Tick de BP_Game y el resto de actores se pararán también

event_tick_cascade
game_event_tick
BP_Game Event Tick

El Delta time debe compartirse entre todos los actores, esto es muy importante para obtener un movimiento bien sincronizado.

dealer_tick

El evento Game Tick de BP_Game_dealer deberá llamar al evento Game Tick de todas sus esferas BP_Game_dealer_beat.

dealer_tick
BP_Game_dealer Event Tick propagation

El evento Game Tick de BP_Game_dealer_beat solo se utiliza para mover la esfera.

beat_game_tick
BP_Game_dealer_beat Event Tick alternative

Con esta llamada el cadena de llamadas de «Event tick» esta completa. La otra parte del Event Tick de BP_Game se utiliza para calcular la aparición de los pulsos. Hemos añadido una variable para eliminar los primeros segundos del análisis, en un análisis en tiempo real podemos obtener falsos positivos en estos primeros segundos.

game_event_tick_2

Sólo queremos generar la esfera en la aparición del pulso, por lo que necesitamos añadir una variable para hacer esto. Cuando esta variable sea falsa y el analizador de pulso devuelva la presencia de pulso tendremos que generar la esfera.

beat_actions
beat_function

Tenemos que añadir un tiempo de cooldown en el actor generador de esferas para evitar generar demasiadas en un periodo corto de tiempo y que se solapen. Tenemos que calcular y pasar los parámetros de modificación de la esfera, como la velocidad de movimiento y la de escalado. Tendremos que pasar también la distancia al botón de captura. Si la esfera del pulso sobrepasa esta posición y el jugador no ha sido capaz de capturarla tendremos que restarle algo de puntuación y marcar el objeto de la esfera para su destrucción.

spawn_beat_sphere
BP_Game_dealer SpawnNewBeat function

Consejo: Para comprobar si el pulso se encuentra dentro de la zona de captura tenemos que añadir cierto umbral alrededor de su centro para dar algo de margen a los reflejos del jugador.

check_beat_inside
IsInside function

El botón del jugador es un cilindro desplazado en el actor BP_Game_dealer. Las esferas de los pulsos se generaran en su punto de origen de esta manera, y se desplazarán en la dirección del cilindro.

dealer_button_component

Para capturar los eventos de ratón tenemos que redirigir el input del Player 0 a este actor utilizando la propiedad que encontraremos en Input > Auto Receive Input.

En la Configuración del Proyecto tenemos que activar opción Mouse Properties > Use Mouse for Touch, esto resultará muy útil si queremos desarrollar el juego tanto para plataforma movil como de escritorio..

Ahora ya podemos enlazar el evento de Inpu Touch Begin del cilindro a nuestra función para comprobar la posición de la esfera del pulso.

touch_event

Esta función recorre todos los actores que representan los pulsos utilizando su función IsInside para comprobar si se encuentra en la zona de captura.

check_beats_function

Si el pulso se encuentra dentro del cilindro entonces el jugador ha capturado el pulso e incrementaremos su puntuación. Sacamos y destruimos este actor de la lista de pulsos del generador.

check_beats_function_2
remove_actor_beat

Y con esto hemos terminado un juego de ritmo muy básico, podemos hacer un juego mas complejo paratiendo desde aquí añadiendo más generadores y efectos, un menu para elegir la canción, un panel de puntuaciones….

youtube_video_rhythm

Tutorial files

Ayudanos con este blog!

El último año he estado dedicando cada vez más tiempo a la creación de tutoriales, en su mayoria sobre desarrollo de videojuegos. Si crees que estos posts te han ayudado de alguna manera o incluso inspirado, por favor considera ayudarnos a mantener este blog con alguna de estas opciones. Gracias por hacerlo posible!

Escribe un comentario

Comentario

  1. Hay forma de añadir mas beats con generadores con la misma pista?, o debo de tener tres pistas diferentes para cada generador

    • Init_beat_tracking_config_Wlimits tiene un parametro (Band Limits) para definir un array de multiples bandas. Puedes definir las frecuencias máxima y mínima de esa bandas. Después en Get_beat_tracking_Wlimits en el parámetro Beats se puede recuperar el analisis por banda mediante su índice. Entonces puedes llevar el tracking de diferentes bandas de frecuencias, siempre que no tengan solapen unas con otras, para una sola pista