06 de junio, 2014
Artículo indiespensable
Indiespensable
Dev Lavde #16 – Hola mundo

«Hello world» susurra la espada parlante de Transistor poco después de comenzar la preciosista aventura de Red. Cualquier programador conocerá de sobra qué representan esas dos palabras. Son el principio, precisamente, bien lo saben en Supergiant Games. Ilustran el funcionamiento más básico de un lenguaje de programación. Es lo primero que el lector encontrará en cualquier tutorial o libro sobre el tema, y el primer paso para quitarse el miedo al código. Pero para programar videojuegos no sirve un simple Hello World. Falta mucho más: entre esas insignificantes líneas de código y los gráficos 3D de última generación, hay un abismo que suele suponer muchos años de estudio y trabajo. Afortunadamente, hay alternativas para evitarlo.

Hablé hace ya tiempo de cómo funcionaba un procesador, y del porqué del código y la programación. También comenté las operaciones que se necesitaban para pintar geometría en una pantalla, calcular la iluminación, o para crear efectos gráficos usando la GPU. Incluso repasé algunos conceptos relacionados con el sonido digital. Bueno, pues todavía faltan infinidad de cosas como cálculos de física para detección de colisiones y movimiento de objetos mediante fuerzas, inteligencia artificial para dar vida autónoma a personajes, juego en red… Todas esas características han de estar programadas en un videojuego, y la mayoría de ellas incluyen desafíos técnicos nada fáciles de atajar, que requieren conocimientos específicos, no sólo de programación.

Pero cuando abrimos el compilador de C++ por primera vez y escribimos ese programa de Hello World, no tenemos nada, de hecho apenas tenemos las funciones necesarias para ordenar a la máquina escribir esas dichosas palabras. Bienvenidos al apasionante mundo de la programación. Así, hacer un videojuego parece una tarea titánica, ¿cómo es posible que haya gente que hace juegos en solitario?

Librerías

Todo empieza con lo que se denomina una «librería». Una de las ventajas de los lenguajes de alto nivel (como C++, C#, Java…) es que permiten que el código sea reutilizado con facilidad. Podemos agrupar código funcional en librerías para ser utilizado en proyectos distintos. Por ejemplo, si se dispone de una librería que calcula multiplicaciones de matrices, ya no hace falta escribir ese código otra vez, nunca más. Ni siquiera hay que saber cómo se multiplica una matriz, ya que la librería lo hace por nosotros. Sólo es necesario escribir una palabra mágica, ya sea include, using, o import, dependiendo del lenguaje.

El programador necesita librerías para hacer su tarea más fácil, o se encontrará con muchos problemas. Ahí es donde entran DirectX y OpenGL para hacer más fácil el renderizado 3D, PhysX o Havok para los cálculos de física, FMOD u OpenAL para el audio, etc. hay muchísimas alternativas, cada una con sus ventajas e inconvenientes. Agregar todo eso a un proyecto puede ser suficiente para empezar a hacer un juego en C++. Pero aun así, sigue siendo algo muy complejo y difícil de entender para los no iniciados. Suele costar mucho aprender a usar esas librerías, ya que cada una está hecha por un equipo de personas distinto, con sus estándares y su forma única de trabajar, lo que complica la integración con el código de juego y más aún integrar unas con otras. Además, si el juego ha de ser multiplataforma habrá que usar distintas librerías según el caso.

Motores

El siguiente paso para facilitar la tarea es tener más características en un solo paquete. Añadir otra capa que simplifique la tarea de usar esas librerías, agrupando la funcionalidad de varias de ellas (y construyendo lo que sea necesario desde cero) para presentar un interfaz de programación más sencillo. A ese conjunto lo llaman «motor gráfico». En esa categoría es donde entran Ogre3D o Panda3D. Usando sus librerías, no necesitarás acceder directamente a las funciones de DirectX ni OpenGL.

Por definición los motores gráficos sólo se encargan de facilitar las tareas de renderizado y construcción de escenas, pero con el tiempo han ido incluyendo más funcionalidad, facilitando el uso de otras características comunes como físicas, sonido, juego en red… Aunque se suelen llamar comúnmente motores gráficos también, quizá es más correcto llamarlos motores de juego, o, simplemente, motores. Muchas empresas utilizan sus propios motores desarrollados íntegramente por el equipo de programación.

Además de proveer librerías de programación, los motores suelen ofrecer ciertas herramientas y programas de utilidad, por ejemplo, parar adaptar ficheros de gráficos a un formato utilizable por el motor, visores de modelos y materiales, herramientas para crear efectos, shaders o sistemas de partículas… Algunos más avanzados incluyen complejos editores de niveles y lenguajes de script más sencillos.

Por poner un ejemplo bien conocido, Unity3D dispone de un completísimo editor que permite colocar y mover objetos al antojo del usuario y programar su comportamiento mediante scripts en C# (lenguaje bastante más digerible que C++), y comprobar inmediatamente cómo resultará nuestro código en el juego. Y algunos motores de hoy en día están tan evolucionados que incluso ocultan por completo la programación: GameMaker, GameSalad, o Construct 2 presumen de permitir hacer juegos sin tener que programar una sola línea de código. Llegamos hasta un punto en el que hacer juegos puede ser un juego en sí mismo, recordemos el original WarioWare: D.I.Y. (Intelligent Systems, 2009) para Nintendo DS, que más allá de ser un juego puede considerarse un motor. En definitiva, hay donde elegir. Encontraremos alternativas para cualquier tipo de necesidad, aunque ya se encargará Unforgiven de analizar el panorama actual de los motores comerciales en el próximo Dev Lavde.

En resumen

Es muy fácil cometer el error de comenzar con C++ (o similar) el aprendizaje en programación cuando la motivación principal es hacer un juego. A menudo se oye que ese tipo de lenguajes son lo mejor para hacer juegos, que usar otras cosas más ligeras te limita, y que el rendimiento se ve afectado. Bueno, eso suele ser cierto. De hecho, si miramos bajo el capó, casi todos los motores comerciales (y no comerciales) están escritos en C++, debido al control a bajo nivel que permite, y la facilidad para portarlo a cualquier plataforma. Pero eso no quiere decir que haya que empezar por ahí, ¿o acaso comenzarías tus andadas en el bricolaje yendo al bosque a talar árboles con un hacha?

Hoy en día, para hacer un videojuego no hace falta saber C++, ni siquiera hace falta saber programar. Es mejor empezar por algo sencillo, aprender y entender la lógica y los desafíos que hay detrás del funcionamiento de un juego y cambiar a algo más complejo cuando te veas limitado. Hay muchísimas alternativas para todos los niveles de conocimientos en programación, sólo hay que escarbar en Internet y trastear un poco. No hagas caso de aquellos que dicen que un buen programador tiene que saber mucho de lenguajes complicados, optimizar la gestión de memoria y blablá. Aunque sea cierto, ¿quién querría ser un programador? Si no has programado en tu vida y sigues este consejo, probablemente nunca llegues a tener que aprender C++. Y créeme, eso es bueno. Puede que no consigas un trabajo en la industria del videojuego, pero tal vez termines algún proyecto que te haga sentir orgulloso.

Acerca de Enrique Hervás


Humano Nivel 32. Diseñador y Programador de videojuegos Nivel 6. De esos a los que sus padres prohibieron jugar a "las maquinitas" por estar demasiado enganchados. No sabían lo que les esperaba. Actualmente trabajo como Game Designer en Exient, e intento no olvidarme de mi pasado indie de Game Jams y jueguitos con Join2 Games

5 comentarios