Project: DarkHeaZ

Programando un motor 3D desde cero - Brakeza3D

Project DarkHeaZ nace como una demo técnica de las capacidades que ofrece Brakeza3D para la creación de un videojuego real con influencias old-school.

Hasta ahora, mis artículos iban orientados exclusivamente a la implementación de un engine3D en si mismo, en los próximos meses iré publicando artículos específicos sobre mis experiencias en la creación de un videojuego del tipo FPS (First Person Shooter) construido sobre motor que he implementado desde cero: Brakeza3D.

Técnicamente uno de mis objetivos principales es mantener el videojuego desacoplado del engine3D y seguir ampliando las características de cada parte ordenadamente. Esto ayudará a mantener la separación a nivel de artículos escritos, que también estarán bien diferenciados en asuntos relativos al «videojuego» o «engine3d».

En la actualidad tengo múltiples frentes de trabajo abiertos, no hay que olvidar que es un proyecto de una sola persona realizado en su tiempo libre, asi que puedo permitirme el lujo de organizarme como me venga en gana. Aunque el avance es constante, el ritmo es lento, lo suficiente como para ver por delante una buena tirada de trabajo pendiente.

Con este enfoque os presento a grandes rasgos los bloques que tengo en la cabeza para las diversas fases del desarrollo, muchas de ellas ya están listas en gran medida, otras requieren mejoras y algunas están sin empezar. Aunque me atrevo a adelantar que probablemente añada alguna, por ahora, son las siguientes:

INTEGRACION GTK RADIANT
65%
CAPA DE CONFIGURACION
40%
KINEMATIC CHARACTER CONTROLLER
75%
GAME INPUT CONTROLLER
90%
MENU MANAGER
25%
WEAPON MANAGER
75%
INTEGRACION CON BULLET PHYSICS
95%
HUD MANAGER
20%
INTELIGENCIA ARTIFICIAL
51%
LORE
1%
ARTE Y DISENO
0%

Os describo a continuación en líneas generales el trabajo que agrupa cada bloque:

1 – Integración GTK Radiant – 60%

En todo el desarrollo de Brakeza3D hemos utilizado mapas (BSP) existentes, ya sean del Quake original o bien descargados por Internet, pero si queremos crear nuestro propio videojuego será necesario disponer de la capacidad de crear mundos a nuestro antojo.

En la actualidad Brakeza3D puede cargar mapas compilados con GTK Radiant 1.6 sin problemas, aunque no todas las características están implementadas.

La carga de geometría, texturas, lightmaps y entidades en el mapa (enemigos, items..) ya está preparada y funcionando, además se incluyen algunas características ya existentes en los mapas, por ejemplo: las puertasascensores, botones, teleporters y triggers de texto en pantalla.

Probablemente deseemos incorporar características únicas y ajustadas a nuestro videojuego. Brakeza3D, incorpora algunas funciones y clases para atender estas tareas (colisiones con triggers, enemigos especiales, etc), se trata de extender los sistemas existentes a medida que el juego crezca.

En un futuro artículo explicaré las diferentes fases para compilar un mapa con GTK Radiant y las herramientas que nos lo permiten (qbsp, vis, light).

De forma paralela estoy dedicando horas sueltas en la creación de un mapa que pueda llamar «propio» basado en un hospital, más para aprendizaje que para su uso final.

2 – Capa de Configuración JSON – 40%

No es dificil imaginarse que nuestro videojuego necesitará de una gran cantidad de variables de configuración que parametrizarán todo tipo de cuestiones. Para agilizar el proceso de pruebas y setup, queremos desacoplar toda esta información del proceso de compilación del juego. Para ello crearemos multitud de ficheros JSON que extenderán las características de nuestro videojuego.

Ejemplos de elementos que forman parte de esta capa de configuración serían:

  • weapons.json: Parametrización de cada arma y sus cualidades. Sprites, cadencia, daño, sonidos…
  • maps.json: Mapas BSP disponibles que formarán las distintas fases del juego.
  • menu.json: Opciones del menú principal.
  • sounds.json: Sonidos del juego.

No es una parte dificil, pero si laboriosa y a la que debemos de comprometernos a mantener rigurosamente a cada variable que deseemos incorporar como elemento configurable en el juego.

Algunas de estas variables serán tan importantes que merecerán integrarlas en el GUI de Brakeza3D para su modificación en tiempo real.

3 – Kinematic Character Controller – 75%

Brakeza3D ya incorpora esta funcionalidad de base implementada sobre Bullet Physics. Con ello podremos movernos por un mapa, saltar y subir y bajar escaleras.

No obstante, será necesario adaptar este funcionamiento a necesidades más concretas en nuestro videojuego. Un ejemplo sería la posibilidad de agacharse o el efecto ralentizador del agua al moverse en volúmenes líquidos (ambos ya implementados).

En la actualidad el KCC es estable y funcional, pero requiere investigar algunas técnicas para poder afrontar un «headbob» creible además de incorporar una ligera inercia al movimiento. Las necesidades de nuestro KCC se encuentran abiertas y en constante evolución.

4 – Game Input Controller – 90%

En la actualidad, en el videojuego estamos sobrecargando prácticamente toda la capa de Input existente en Brakeza3D en lo que llamaremos GameInputController. En este bloque mantendremos el INPUT del usuario conectado con el juego.

El videojuego requiere manipular un menú, cambiar de armas, habilitar el sniper, agacharse y por supuesto permitir moverse por el mapa. En definitiva mapearemos cada acción que nos interese capturar en nuestro videojuego con su funcionalidad correspondiente.

El objetivo de este bloque será aproximarnos a un gameplay divertido y eficaz y se vincula estrechamente a las características de nuestro Kinematic Character Controller.

5 – Menu Manager – 25%

Todo videojuego que se precie tiene su menú principal con opciones. Project DarkHeaz no iba a ser menos e incorpora este apartado. Por supuesto se incorpora un sistema para añadir opciones fácilmente.

Por ahora la funcionalidad del menú es muy pobre. Simplemente enlaza el estado de PAUSA con el juego y permite iniciar y salir del juego.

En el futuro incorporaré el apartado de OPCIONES, donde podremos parametrizar distintas facetas de nuestro juego.

6 – Weapon Manager – 75%

Ya que pretendo emular un juego de disparos en primera persona, prestaremos especial atención al tratamiento de las armas y sus funcionalidades. Como podéis observar he optado por una aproximación 2D para la visualización de las armas. Por ahora esta decisión me evitará complicaciones de diseño.

He implementado un sistema bastante flexible que me permite añadir nuevos tipos de arma con relativa facilidad, sin ataduras a estados rigidos y altamente configurable.

En la práctica, el trabajo consiste en configurar dicho sistema para cada arma y pulir detalles que puedan surgir, además de ir alimentando la capa de diseño progresivamente.

El sistema de disparos, está sometido a las físicas proporcionadas por Bullet Physics y Brakeza3D ya enlaza las colisiones de las mismas, ofreciendo fáciles mecanismos para procesar cada colisión según las necesidades de nuestro juego. Mediante estas funciones hacemos cosas como procesar el daño que hace una bala al impactar, detectar si el enemigo «explota» o no, añadir algún tipo de FX  y un largo etc.

7 – Integración con Bullet Physics – 95%

Brakeza3D se integra completamente con Bullet Physics y todas sus posibilidades.

Existen mecanismos para convertir en «cuerpo rígido» sometido a un mundo físico tanto mayas complejas (geometrías OBJ por ejemplo), sprites o billboards.

Podremos alterar los parámetros físicos que afectan a nuestro mundo a nuestro antojo. Por ejemplo podríamos ralentizar la velocidad de la simulación física para conseguir un efecto «bullet time» con Neo en Matrix…

8 – HUD Manager – 20%

Otro de los elementos obligatorios en un videojuego será el sistema que gestionará el  HUD.

Por ahora, nuestro HUD se encarga de mostrar de forma modesta la información básica de juego, ya sea la vida, arma seleccionada o munición disponible.

En futuras versiones, nuestro HUD ha de responder a multitud de eventos in-game que nuestro jugador deberá de poder ver de forma clara, para reaccionar en su justa medida.

Indicadores de oxigeno, daño, vitalidad son ejemplos de eventos que tendrán que ser incorporados a nuestro HUD.

9 – Inteligencia Artificial – 50%

Otro de los bloques indispensables en un videojuego con un mínimo de complejidad es la Inteligencia Artificial.

Nuestro videojuego incluye un sistema de IA sometido contra una máquina de estados que controla el comportamiento de nuestros enemigos. Por ahora los NPCS nos buscan, se ponen a distancia de rango, nos disparan y buscan vida si se encuentran heridos. Cosas sencillas.

Brakeza3D ofrece herramientas para interpretar la maya de navegación existente en el mapa BSP cargado. La maya de navegación es utilizada por Brakeza3D para calcular caminos, raytracings, parábolas y multitud de opciones entre dos puntos.

En el futuro aumentaremos la compejidad de la máquina de estados que gestiona nuestros enemigos. Otro foco importante de trabajo aquí, es la optimización de los algoritmos que trazan caminos, algo lenta por ahora.

10 – LORE – 0%

No podemos olvidar el contexto histórico del juego, su universo y sus personajes.

Ya que soy totalmente profano en este tema, más allá de mis aportaciones en forma de deseos, me gustaría encontrar la ayuda adecuada para ejecutar esta parte con garantías. Sin duda necesito ayuda en este punto!

Será importante sincronizar los avances de esta parte con nuestro siguiente punto, la creación del arte y diseño del videojuego

11 – Arte y diseño – 0%

Por ahora todo nuestro desarrollo utiliza un arte temporal basado en assets encontrados y reutilizados de Internet.

A pesar de realizar algún intento (y de gastar algunos centenares de euros) en avanzar en esta parte, he preferido esperar y buscar la ayuda adecuada, ese grupo de personas apasionadas en este campo que puedan estar interesadas en dejar su huella en el projecto. Aunque principalmente debido a la ausencia de ningún tipo de LORE existente.

Nuestra línea argumental determinará el tipo de texturas, sonidos y todo tipo de asset que diseñemos para el videojuego.