Capitulo 2 Estado de la Cuestión

Sin valoraciones

Capitulo 2 Estado de la Cuestión

En este capítulo se va hacer un estudio sobre las técnicas y herramientas utilizadas para la creación de enemigos. Se hará una breve mención a la inteligencia artificial en general y se especificará cómo funciona en videojuegos. Posteriormente se explorarán algunas técnicas de creación de enemigos, argumentando su uso en juegos 2D conocidos. Se mencionarán, además, herramientas actuales que sirven para la creación de NPCs y que se utilizan para generar enemigos con las técnicas previamente comentadas. Finalmente, se explorarán los motores de videojuegos más sencillos de utilizar, orientados tanto a programadores noveles como a diseñadores, y se extraerán los puntos positivos que servirán de inspiración para crear un catálogo de componentes que resulte sencillo de utilizar.

2.1 Breve introducción a la IA.

La inteligencia artificial, abreviado IA, es la inteligencia demostrada por máquinas pe­ro programada por humanos. Se podría resumir la inteligencia artificial como cualquier dispositivo que es capaz de percibir su entorno, en base a lo que conoce y/o a unas reglas limitantes, tomar decisiones que maximicen las probabilidades de alcanzar sus objetivos. Particularmente, en videojuegos es lo que le permite a los NPCs simular comportamientos inteligentes, con una cierta lógica, considerando una serie de objetivos que deben de alcan­zar y de restricciones que deben cumplir para poder tomar una decisión con coherencia. A día de hoy, la inteligencia artificial es una parte intrínseca de los videojuegos, debido a que mejora la experiencia de juego y crea desafíos al jugador.

Los videojuegos empezaron a cobrar fuerza en la década de los 80, cuando vivieron su edad de oro. Lo que diferenciaba a los videojuegos de esta época con respecto a los predecesores era que podían ser jugados de forma individual, ya que contaban con un modo de un jugador o modo “contra la máquina“. Estos juegos contaban con elementos nuevos que hacía que supusiera un reto jugarlos, ya que el jugador tenía que enfrentarse a una inteligencia artificial que le obstaculizara el llegar al final del juego y le supusiera un desafío que superar. Esta inteligencia artificial, por regla general en los juegos de la época, se manifestaban en forma de enemigos.

La inteligencia artificial de estos enemigos, o NPCs, se aleja de los algoritmos mate­máticos de toma de decisiones, y se centra en otros aspectos del juego como la capacidad de moverse a través de un plano. La búsqueda de una ruta, por ejemplo, es un uso tan común en la inteligencia artificial que, a día de hoy, se da por hecho que todos los enemigos móviles de un videojuego la tienen, en mayor o menor medida.

Hay muchas técnicas para diseñar e implementar los comportamientos que tendrán los enemigos de cualquier videojuego, pero dos de las más utilizadas son las máquinas de estado finitas y los árboles de comportamiento que se verán en las siguientes subsecciones.

2.2.1 Máquinas de estado finitas.

Las máquinas de estado finitas, conocidas por sus siglas anglosajonas FSM, finite state machine, son un conjunto de estados abstractos que definen los estados de un sistema. En el caso de las FSM de videojuegos, sería el conjunto de estados que puede tomar una entidad, contando con un único estado activo. Una entidad puede cambiar su estado a otro mediante un input determinado, y esas relaciones entre estados son lo que se denominan transiciones. Como describe Bosch (2009), «Las FSM permiten definir una serie de estados y que cada uno de ellos de un comportamiento distinto a las entidades que los contienen«. Las entidades, por tanto, tendrán un comportamiento distinto en cada uno de los estados, y que se manifiesta directamente en el videojuego. Mediante ciertos eventos que pueden transcurrir durante una partida, una entidad enemiga puede identificar esos eventos co­mo input para cambiar su estado activo, dando así la sensación de que los enemigos son entidades inteligentes.

Diseñar enemigos, como menciona Sabbagh (2015), es “un arte en si mismo, ya que el diseñador tiene que saber crear en los enemigos de un videojuego un término medio entre que resulte un desafío para las habilidades del jugador pero dándoles la oportunidad, además de la satisfacción, de derrotarlos. Uno de los primeros juegos con un diseño de enemigos que utilizan máquinas de estado finitas fue el Pac-Man, del japonés Toru Iwatani (1980).

Pac-Man es un videojuego arcade sencillo en apariencia, pero sorprendentemente pro­fundo. El objetivo del juego es conseguir que el protagonista del juego, un círculo amarillo con boca, se coma todos los puntos pequeños de un laberinto para avanzar de nivel. No obstante, hay cuatro fantasmas en este laberinto que harán que termine la partida si atra­pan al jugador, por lo que este tendrá que o bien esquivarlos, o bien comerse un objeto especial que le permite comerse a los fantasmas. Como se puede ver en la Figura 2.1, la lógica que se debería seguir para jugar de forma eficiente a Pac-man se puede describir como una máquina de estados finita donde cada estado representa la acción más deseable en función del input.

Comenta Mateas (2005) en su tesis, que “los comportamientos de los fantasmas son críticos para entender el juego«. Cuando uno piensa en los fantasmas del Pac-Man, la definición superficial del comportamiento es que se limitan a perseguir al jugador por el laberinto y si el jugador ha obtenido el objeto que le permite comerse a los fantasmas, estos huirán de él. Lo cierto es que los movimientos de los fantasmas no son tan sencillos, ya que tienen unos comportamientos definidos por máquinas de estado finitas, distinguibles entre si y además estos comportamientos de movimiento impactan directamente sobre la experiencia del jugador. Estos comportamientos deben suponer un desafío para el jugador, pero sin ser imposibles de superar, y darle la sensación de que los enemigos siguen unas tácticas definidas.

Capitulo 2 Estado de la Cuestión

Figura 2.1: FSM de Pac-man, extraído del libro de Yannakakis y Togelius (2018)

Cada fantasma de Pac-Man tiene un comportamiento distinto a los demás, represen­tado en una forma de moverse por el laberinto que sea un indicativo de la estrategia que sigue cada fantasma. Davis (2008) explica que los fantasmas de Pac-Man tienen unos mo­vimientos diferentes porque cada color de enemigo representa un fantasma personalizado con nombre propio, y que la forma de moverse de estos fantasmas es debido a que tienen diferentes «personalidades». Como se puede ver en la Figura 2.2, el juego original de 1980 contaba con 4 tipos de fantasmas distintos, y que cada uno de ellos tenía una personalidad (en inglés, character) y un mote (nickname). En primer lugar, el fantasma rojo, Blinky, limita su táctica a perseguir a Pac-Man y por ello se le denomina shadow en el juego origi­nal. En el caso del fantasma rosa, Pinky, su tipo de personaje era speedy, que sugiere que va más deprisa que el resto. No obstante, todos los fantasmas se mueven a la misma velocidad, por lo que el nombre no se refiere a la velocidad de movimiento sino a la anticipación de los movimientos del jugador ya que intenta rodear a Pac-Man y cortar rutas de escape. El resultado de alternar estos dos tipos de movimiento nos da lugar al tercer fantasma, el fantasma azul, Inky, que alterna a intervalos aleatorios entre perseguir directamente a Pac-Man y rodearle mientras que el fantasma amarillo, Clyde, se mueve de forma libre por el laberinto, y parece no reparar en el jugador de forma activa ni siquiera cuando este está cerca.

Cada uno de estos NPCs tenía una forma distinta de moverse por el laberinto, y esas distinciones de movimiento eran lo que definía la táctica para atacar al jugador. Todos en conjunto representaban el obstáculo al que se tenía que enfrentar el jugador para avanzar por los laberintos y conseguir la mejor puntuación.

2.1.2 Árboles de comportamiento.

Los videojuegos de los años 80 dejaron claro que los enemigos ya no esperaban a que llegase su turno para pasar a la acción, sino que eran personajes que estaban en constante movimiento, siempre alerta, diseñando tácticas y estrategias en base a los movimientos del jugador. Posteriormente, los enemigos empezaron a ser capaces de modular sus tácticas

Capitulo 2 Estado de la Cuestión
Figura 2.2: Fantasmas de Pac-Man, 1980

para que sean más o menos efectivas, ofreciendo así diferentes niveles de dificultad. Este avance en los comportamientos de los NPCs fue posible gracias a los árboles de compor­tamiento.

Un árbol de comportamientos es un árbol de nodos, organizados según una jerarquía, que controlan el flujo de decisiones de una entidad con inteligencia artificial. Como explica Simpson (2014) en su artículo, en los extremos del árbol se sitúan los comandos de acción que controlan la entidad, y en las ramas hay varios tipos de nodos de utilidad, que deciden por qué camino descenderá la toma de decisión, con el fin de que el comando final sea la acción o secuencia de acciones que mejor de adaptan a la situación. Los árboles de comportamiento tienen dos grandes ventajas: La abstracción de la implementación y la modularidad de los comportamientos.

Un ejemplo perfecto para ejemplificar los árboles de comportamiento es el videojuego Hollow Knight (Figura 2.3) creado por Team Cherry en el año 2017 y financiado mediante apoyo popular en una exitosa campaña de kickstarter. Es un video juego de acción lateral donde manejas a un personaje que viaja por unos detallados mapas dibujados a mano y se enfrentará a una cantidad enorme de enemigos, muy bien construidos y variados. Igual que en Pac-man, los enemigos siguen tácticas tanto de movimiento como de ataque que varían en función del enemigo. Estas tácticas son fácilmente distinguibles por el jugador, ya sea porque las ha visto previamente o porque el aspecto del enemigo te aporta información visual sobre esos patrones.

Hay enemigos que sólo atacan en determinadas condiciones: si el jugador tiene poca vida, está muy cerca o si está siendo atacado por otro enemigo. De la misma manera, hay enemigos que al ser atacados deciden huir, retirándose para volver a intentar el ataque momentos después. Por ejemplo, en la Figura 2.3 se observa un tipo de enemigo que vuela manteniendo las distancias con el jugador, y es precisamente en función de esa distancia

Capitulo 2 Estado de la Cuestión

Figura 2.3: Hollow Knight (Team Cherry, 2017)

lo que define el modo de ataque: si está lejos, lanzará proyectiles en línea recta hacia el jugador mientras que si está lo suficientemente cerca cargará hacia él. El juego cuenta con entidades más complicadas de derrotar que son los jefes. Los jefes son enemigos más poderosos que generalmente el jugador debe derrotar si quiere avanzar en el videojuego. Lo que caracteriza a un jefe de un enemigo normal es que no tiene una única forma de atacar al jugador, sino que va incorporando ataques más complicados a medida que el jugador le hiere, incluso es capaz de cambiar de comportamiento en mitad de la batalla.

2.2 Herramientas para la creación de NPCs.

Como se ha comentado anteriormente, las técnicas de creación de NPCs han ido evo­lucionando a lo largo del tiempo. Debido a ello, surgió la necesidad de crear herramientas que ayudasen a los desarrolladores a crear enemigos complejos. Se han escogido dos herra­mientas relativamente populares, que proporcionan interfaces gráficas muy sencillas.

2.2.1 Playmaker.

El equipo, Team Cherry, reveló en una entrada de su kickstarte que los árboles de comportamientos de Hollow Knight han sido creados con una herramienta de scripting visual llamada Playmaker, por Hutong Games.

Playmaker es una herramienta muy versátil, orientada a artistas y diseñadores para permitirles desarrollar videojuegos sin necesidad de código. Su interfaz es muy visual, similar al diseño en papel, pero es capaz de extraer el potencial que tiene Unity con un amplio catálogo de acciones. Las acciones son eventos comunes de un videojuego como, por ejemplo, hacer zoom con la cámara. En circunstancias normales estas acciones tendrían que estar programadas a mano, por lo que contar con una herramienta de este tipo supone un ahorro de tiempo para personas que no saben programar. De la misma manera, esta herramienta sirve de ayuda para las personas que sí sepan programar porque es fácilmente extensible con scripts propios, por lo que se podría utilizar con los componentes de mi TFG.

Playmaker está disponible en la asset store de Unity, una tienda virtual de Unity donde se pueden comprar distintos elementos para el desarrollo de videojuegos, por un precio razonable. No obstante, en el caso de las empresas más pequeñas o con pocos recursos, ¿Acaso existe una API de creación de NPCs que solucione este problema, y que permita a un equipo crear enemigos funcionales con un gasto mínimo?

2.2.2 Behaviour Bricks.

Al buscar sobre herramientas comerciales para crear NPCs en general, y enemigos en particular, aparece un artículo muy interesante sobre un modelo integrador de máquinas de estados y árboles de comportamiento para videojuegos creado por Sagredo-Olivenza et al. (2016). La herramienta se llama Behavior Bricks, sirve para hacer árboles de comportamiento para videojuegos de forma visual con un editor propio, pensado para el motor de videojuegos Unity. Es una herramienta gratuita que se puede encontrar en la asset store, la tienda virtual de Unity. Esta herramienta fue desarrollada por Padaone Games, empresa asociada a la Universidad Complutense de Madrid.

Capitulo 2 Estado de la Cuestión

Figura 2.4: Behaviour Bricks, Padaone Games

Behaviour Bricks es una herramienta de scripting visual y por tanto presenta muchas similitudes con Playmaker: ambas herramientas aspiran a promover la colaboración entre diseñadores y programadores. No obstante, Behaviour Bricks pone un énfasis extra en el rendimiento de la aplicación y en la gestión de memoria. Gracias a su optimización se garantiza que el uso de esta herramienta no suponga un lastre en el rendimiento del juego final.

2.3 Motores de videojuegos.

Se ha hablado de las herramientas externas, fácilmente integrables en el motor de videojuegos Unity y que existen para crear NPCs inteligentes, pero lo cierto es que en de­terminados motores de videojuegos estas herramientas forman parte del núcleo principal. A continuación, se van a analizar dos motores de videojuegos caracterizados por ofrecer diver­sas ayudas para hacer videojuegos a usuarios que no necesariamente tengan conocimientos avanzados de programación.

2.3.1 Construct 3.

Un ejemplo de motor de videojuegos orientado a personas que no necesariamente sepan programar es Construct 3, creado por Scirra 5. Esta herramienta destaca porque está orientada a videojuegos en 2D, es sencilla de usar y es muy visual. A pesar de que se puede crear código propio con este motor, la idea de la herramienta es que mediante unas interfaces gráficas se puedan construir comportamientos para NPCs.

Construct 3 cuenta con un elemento llamado hojas de evento (en inglés, event sheets), que son similares a los archivos fuente de los lenguajes de programación convencionales. Cada hoja tiene una lista de eventos, que contienen condicionales o sensores, y una vez esos sensores detectan una condición preestablecida, se activarán una serie de acciones asocia­das. Con este sistema, es posible hacer videojuegos sofisticados sencillamente arrastrando y soltando los elementos en la escena, añadiendo los eventos necesarios y sin necesidad de aprender un lenguaje de programación. Por supuesto, en Construct 3 existen objetos al igual que en otros motores de videojuegos, y con los comportamientos adecuados se pueden convertir en agentes inteligentes que sirvan de enemigos en videojuegos.

Capitulo 2 Estado de la Cuestión

Figura 2.5: Editor Construct 3, 2020

Lo más positivo de Construct 3, que he intentado replicar en la herramienta, es lo rápido y sencillo que es hacer un videojuego de tal manera que cualquier persona puede aprender a usarla en poco tiempo. Existe una curva de aprendizaje en este motor de videojuegos, por supuesto, pero es muy leve y llevadera. Para desarrolladores noveles, lo más atractivo de la herramienta es que ya existe un catálogo de componentes previo (Figura 2.6), así como una serie de sensores que están muy bien construidos, con un nivel de abstracción que te permite tener un juego construido sin que el usuario se preocupe de cómo funciona por dentro, sacando así un videojuego con poco esfuerzo y en muy poco tiempo.

Si se compara con Unity, el motor de videojuegos empleado en este TFG, la conclusión es que Unity es mucho más potente pero para realizar cualquier comportamiento que se desee es necesario entrar de forma obligatoria a hacer la programación a mano, lo que puede resultar complicado y frustrante a desarrolladores noveles. Por ello, a pesar de que Unity es el motor de videojuegos que finalmente he escogido por diversos motivos que trato en el Capítulo 4, se querían integrar los valores que hacen que Construct 3 sea tan accesible.

Figura 2.6: Movimientos en Construct 3, 2020

Con Construct 3, es posible crear enemigos de forma sencilla ya que nos proporcio­na funcionalidades básicas como un movimiento en linea recta hacia delante (bala) o la posibilidad de modificar la orientación del objeto (girar). Mezclando esos dos elementos constantemente se puede obtener un enemigo que se lance a por el jugador girando previa­mente hacia su posición. Además, si hace eso mismo cada cierto tiempo se obtendría un enemigo que te persigue, algo con un poco de profundidad y se puede realizar sin programar una línea de código. Algunos de los movimientos pre-programados son movimientos sim­ples, no obstante que también cuenta con movimientos físicos, movimientos en cuadrículas o incluso proporciona las herramientas para crearlo como una combinación de movimientos (personalizado). Sin embargo Unity carece de una herramienta de este estilo, y es lo que este TFG intentará suplir mediante un catálogo de componentes de movimiento similar para poder hacer juegos en 2D con enemigos funcionales.

2.3.2 Game Maker.

Entre los motores de videojuegos sencillos de utilizar por casi cualquier persona y que nos permiten crear NPCs destaca el motor Game Maker que, al igual Construct 3, se especializa en videojuegos 2D y se caracteriza por ser muy fácil de utilizar, pudiendo hacer videojuegos mediante un sistema visual de arrastrar y soltar, sin tener que programar. Además de este sistema, ofrece programación de scripts con un lenguaje propio conocido como lenguaje Game Maker para apelar a los usuarios más avanzados, o que prefieran aprender a programar.

Como herramienta para crear NPCs, Game Maker tiene funcionalidades para hacer ob­jetos de forma gráfica, con un sistema de nodos que permite aplicar componentes a objetos en la escena de forma muy cómoda. Al igual que sucede con Construct 3, Game Maker cuenta con un sistema de eventos que se activarán de forma automática bajo una serie de condiciones también pre-programadas. Es un motor de videojuegos sencillo de aprender a usar, pero no es tan sencillo porque no aporta tantos componentes de movimiento pre­diseñados sino que cuenta con un editor de código donde se pueden programar scripts en un lenguaje propio llamado Game Maker Language.

Capitulo 2 Estado de la Cuestión

Figura 2.7: Game Maker, 2020

Mientras que el motor de videojuegos Game Maker cuenta con muchas facilidades a la hora de crear videojuegos en dos dimensiones, el hecho de que permita crear scripts tiene la ventaja de que el usuario puede crear algo que se adapte a sus necesidades concretas, y aunque este usuario no sepa programar existen muchos tutoriales sobre Game Maker y su particular lenguaje de programación. Es cierto que en Construct 3 se tarda muy poco en tener un personaje moviéndose en 8 direcciones que sirva para un NPC de un videojuego con vista de pájaro, mientras que en Game Maker ese mismo control del movimiento habría que programarlo, pero el principal problema que tiene Construct 3 es que todos los videojuegos parecen iguales, mientras que los videojuegos publicados con el motor Game Maker tienen una variedad muy notable, y son más populares por lo general. Unity es más complicado que Game Maker, y esto puede resultar abrumador, pero es precisamente en un motor como este donde hace mucha más falta una herramienta que ayude a los desarrolladores noveles, pero que además tenga un potente editor de scripting donde los desarrolladores más veteranos puedan modificar la herramienta, o ampliarla a su gusto.

Un ejemplo de juego actual con NPCs creados en este motor es el título Undertale7, creado por Toby Fox en el año 2015. Este videojuego se aleja un poco de los juegos de avance lateral que se han comentado previamente, porque este es un juego RPG donde cada enfrentamiento luchas contra un enemigo en una pantalla por turnos, donde en tu turno puedes elegir una acción y en el turno del enemigo te ataca con un ataque de estilo bullet hell, que consisten en una serie de proyectiles que aparecerán en la pantalla. Durante un combate, el jugador controla un pequeño corazón rojo, confinado en una región en mitad de la pantalla, y deberá esquivar los proyectiles que aparecen en la pantalla en el turno del enemigo. Estos proyectiles rara vez son balas que viajan en línea recta, sino que siguen unos patrones sencillos de movimiento e infligen daño al jugador si entran en colisión con este. Los movimientos de los proyectiles pueden ser laterales, en caída libre o avanzar de forma sinodal que son formas de moverse muy clásicas de los videojuegos laterales en 2D.

Capitulo 2 Estado de la Cuestión

Figura 2.8: Undertale (Toby Fox, 2015)

2.4 Conclusiones del análisis

A modo de resumen, se recopilarán los puntos positivos tanto de las herramientas de creación de NPCs como de los motores de videojuegos orientados a desarrolladores noveles que se han comentado. Este proyecto, como se ha explicado previamente, consistirá en un catálogo de componentes de movimiento y surge con la idea de ser una herramienta para hacer enemigos sencillos y personalizables. Este catálogo deberá ser modular y, por tanto, fácilmente ampliable con comportamientos nuevos por lo que se podría integrar su contenido con alguna técnica de creación de comportamientos complejos, ya sea con FSM o con árboles de comportamiento que se han estudiado al principio de este capítulo.

En cuanto a los puntos positivos de los motores de videojuegos analizados, se destaca de Construct 3 la facilidad que ofrece al usuario para añadir componentes de movimiento a cualquier objeto gracias a su ventana emergente. Además, Construct 3 cuenta con un catálogo propio de componentes y de componentes capaces de percibir el entorno para activar “eventos“, con lo que se añade una capa de personalización a los enemigos que sería muy positivo para el catálogo de componentes que se va a desarrollar. Del análisis acerca de Game Maker han resultado especialmente interesantes las técnicas de scripting visual, que hacen que resulte sencillo utilizar una herramienta aunque no se tenga un conocimiento avanzado de la misma, si esta emplea ayudas visuales que, por ejemplo, representen el movimiento que va a seguir un enemigo antes de que ocurra.

Compártelo en tus redes

Share on facebook
Share on twitter
Share on linkedin
Share on pinterest

Valore este curso

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Utilizamos cookies para asegurar que damos la mejor experiencia al usuario en nuestra web. Si sigues utilizando este sitio asumimos que estás de acuerdo. VER