Estructura Básica de un Videojuego (Programación)

Hace un par de días un amigo me comentó que estaba programando un tetris pero que no sabía por donde empezar, y muchos menos por donde seguir. Estas dudas se basaban en su mayoría en el desconocimiento de los conceptos y elementos que componen un videojuego, lo que hacía que no pudiese deducir que comportamiento debía implementar. Otro problema venía cuando él, siguiendo el ejemplo de un videojuego (tres en raya) que hicimos en clase, intento programar el videojuego como una aplicación de escritorio basada en eventos. Nos vamos a olvidar de la tecnología que hay debajo, para comentar que procesos se involucran en el funcionamiento de un videojuego en la parte de programación, comentarémos lo dicho sobre el ejemplo del tetris, y comentaremos la relación de porque el tres en raya se pudo implementar de esa forma.

La estructura del código de un videojuego presenta un esquema básico que se aleja en cierta forma del de otro tipo de software. Este esquema es fácil de deducir si tenemos en cuenta las particularidades de un videojuego. También se comentarán las posibles diferencias respecto a un programa habitual de escritorio.

En primer lugar debemos tener en cuenta que un videojuego representa un mundo con sus propios normas. Este mundo se representa por una serie de atributos con diferentes estados, de forma que en cada frame (cambio de estado representado en pantalla) este conjunto de atributos en conjunción forma el estado del mundo. El estado del mundo sólo podrá cambiar según un conjunto de normas establecidas durante el diseño del gameplay, que se denominan lógica de juego. Además otro aspecto clave es que el estado se debe actualizar n veces por segundo mostrando así n frames por segundo (fotograma/segundo).

En segundo lugar, está la interactividad con el usuario, cuyo alcance también se especifica junto con el gameplay. De hecho, la interactividad es la seña de identidad de los videojuegos respecto de otras artes y productos de ocio, una obra que cambia en respuesta a las señales que recibe de los usuarios. Así, un subconjunto de las entidades del mundo debe responder a los estimulos del usuario según la lógica de juego. Esto se realiza mediante el chequeo del input de los controles.

Entiendase por entidad un elemento que conforma el mundo y que se comporta según las normas del mismo. Podemos decir que el mundo se conforma de un serie de entidades con atributos y comportamiento, que además interactúan con el mismo según las normas de la lógica de juego y los propios atributos del mundo. Así estas entidades también deberán actualizar su estado en cada frame. El comportamiento de una entidad viene dado por las normas del mundo y sus propias normas de cambio de estado. Las entidades que son capaces de responder a los estímulos del usuario de una forma coherente con las normas del mundo y sus propias normas, se dice que tienen una inteligencia artificial (IA). Así en cada frame se deberá actualizar el estado de las entidades.

Por último, el usuario debe recibir una representación del mundo por los dispositivos de salida que comprenda el estado y pueda interactuar de forma que consiga acometer los objetivos del juego. Las formas más usadas (prácticamente siempre) para representar el mundo son la información visual (render en pantalla) y la sonora (reproducción de sonidos por los altavoces).

Ahora que ya sabemos que procesos básicos realiza un videojuego, podemos pasar a estructurarlo. En primer lugar se comprobará la interacción con el usuario. Después, la lógica de juego actualizará los atributos del mundo y sus entidades según la interacción con el usuario. Una vez se haya actualizado el estado del mundo, se presenta al usuario por los dispositivos de salida (render de gráficos, sonido, vibración). Este esquema se repite hasta que la ejecución del juego finaliza.

En conclusión, la estructura básica de un juego suele presentar un bucle principal que se repite hasta que termina el juego, en el que se realizan las tareas antes comentadas. A este bucle se le denomina game loop:

Mientras juego_en_ejecucion hacer
comprobar_input_jugador;
logica_de_juego;
render_gráficos; reproducción_sonidos;
fin_mientras;

Esta estructura contrasta con la estructura de un programa de escritorio habitual en que diferentes componentes responden a eventos generados por el sistema operativo, y salvo que se realicen proceso de background, estos componentes no cambian su estado sin los eventos. Además los videojuegos son un tipo de software muy exigente en cuanto a recursos, ya que estas tareas se deben repetir (el render 3D es muy costoso) n veces por segundo, y a veces conseguir ese frame rate es todo un desafío que recae principalmente en la tecnología.

No todos los juegos necesitan esta estructura, existen casos en los que el mundo sólo debe ser actualizado si el usuario realiza una interacción (genera un evento dentro del videojuego). Este es el caso del tres raya, ya que el tablero (mundo) sólo cambia cuando el jugador pone una nueva pieza, sino no pasa nada. Podemos pensar que si limitamos el tiempo ya no estamos en ese caso, sino que volvemos a necesitar un gameloop en el que se compruebe a cada ciclo si se ha cumplido el tiempo, o este evento podría venir dado por el lenguaje. De todas formas, debemos tener en cuenta que aunque el juego no sea el que comprueba si se han producido eventos, hay un componente de software a un nivel de abstracción inferior que lo hace, la única diferencia es que el proceso es transparente al videojuego que sólo deberá preocuparse cuando le avisen de que ha ocurrido un evento. Por tanto, al final todas las tareas comentadas anteriormente siempre se realizán ya sea en un loop general o en diferentes componentes de software.

Analizando un ejemplo: El Tetris

Para ver lo comentado vamos a analizar un ejemplo conocido ya por cualquier jugador, el tetris.

Empezamos nuestro análisis determinando el mundo, que en este caso, es la matriz de cuadrados en la que se colocan las fichas. Las entidades del mundo son las fichas, que se comportan según una norma del mundo que dicta que deben caer a una velocidad proporcional al nivel en que se juega. Las normas del mundo dictan que cuando en una linea horizontal de la matriz todas los huecos están ocupados por piezas estas desaparecen sumando puntuación, y si alguna pieza no puede entrar completamente en la matriz la partida acaba. La normas de juego se pueden expresar como operaciones lógicas o de cambio de estado.

La interacción del jugador afecta a la lógica del juego de forma que la entidad que está cayendo cambia su posición según las teclas establecidas. Si se pulsa a derecha, la ficha se debe mover a la derecha (o hacia donde se decida), si se pulsa otra tecla que afecta al gameplay se procesará de la misma forma. Esta interacción se ha definido sobre un paradigma tradicional de comando físico con botones, actualmente hay versiones de tetris táctiles o por acelerometro por ejemplo.

Por último, la presentación al jugador se dividirá en gráficos y sonido. El render de los gráficos se realizará en 2D, se deberán dibujar las entidades (piezas, fichas) y la matriz del mundo, además de otros elementos de feedback al usuario como mostrar la puntuación o el nivel. El sonido consistirá en la música de fondo, más los sonidos al acoplas piezas o a completar piezas.

1 Comment

  1. Está muy bien explicado! Ahora entiendo la diferencia entre un videojuego y una aplicación basada en eventos =)

Deja un comentario

© 2017 Fran Muñoz

Theme by Anders NorenUp ↑