Desarrollo de videojuegos

¿Por donde empezar?

Desde niño siempre me han gustado los videojuegos, y siempre había tenido curiosidad de cómo es el proceso para crear uno. Finalmente, hace 6 años, decidí que era tiempo de aprender a desarrollarlos; después de idealizar por unos minutos un videojuego perfecto como primer proyecto, tuve que volver a la realidad: “¿Y por dónde empiezo?” Entonces comencé a buscar información en Internet, que en aquel entonces era muy escasa; parecía que mis dudas aumentaban en lugar de disminuir: “¿Qué lenguaje de programación se utiliza?, ¿se usa algún compilador en especial?, ¿qué estructura tiene un juego?, ¿qué necesito aprender?, ¿cómo se hacen los juegos para las consolas?” Eran algunas de las muchas preguntas que tenía.Muy rápido me di cuenta de 3 cosas: la primera es que no existía algún libro ni tutorial que enseñe todo lo que se necesita saber; la segunda es que toda la información existente estaba en inglés (y eso no ha cambiado); y la tercera, es que ni siquiera ahí me podría escapar de las matemáticas –la dirección en la que se mueve un objeto, determinar si está dentro del rango de visión de la cámara virtual, determinar si un vehículo chocó contra un edificio; todo eso requiere matemáticas.

Desafortunadamente, en México todavía no existe una industria de desarrollo de video-juegos como tal, y es una lástima, porque es una industria de billones de dólares. Ya existen carreras de desarrollo de videojuegos en universidades internacionales, pero en muchas universidades de nuestro país ni siquiera se toma en serio la materia de gráficas por computadora, que es la base de todo.

Esto en gran parte se debe a falta de información, muchas personas creen que es lo mismo jugarlos que desarrollarlos. Un juego 2D puede ser fácil, pero uno 3D es algo muy diferente y se necesitan muchas personas trabajando en conjunto para crearlo. No es que una sola persona no pueda, pero se tardaría mucho más tiempo. Un juego comercial tarda entre 1.5 y 3 años para ser desarrollado, con un equipo de 25 personas en promedio. Un juego 3D generalmente tiene programación orientada a objetos, cálculos trigonométricos y de álgebra lineal que se ejecutan durante todo el juego, estructuras de datos especializadas, y también puede existir una red neuronal para el manejo de la inteligencia artificial, así como algo de teoría de autómatas finitos y teoría de grafos aplicada, entre muchas otras cosas. Y aún así, hay maestros de universidades que cuando se les presenta un juego como una idea para un proyecto final, solo dicen en tono despectivo “¿otro jueguito?”

Tuve la oportunidad de participar en el Festival de Desarrollo de Videojuegos Creanimax 2006, y me di cuenta que por fin se están haciendo esfuerzos para entrarle a esta industria. Me di cuenta de que hay algunas compañías interesadas en desarrollar juegos, pero falta apoyo y habilidades técnicas. También me enteré de un par de universidades en Guadalajara que están incorporando una carrera de animación y arte digital a su oferta académica. Hay muchas personas involucradas ya en el modelado y animación 3D –y son buenos–. Entonces no vamos tan mal, sólo falta ponernos las pilas, organizarnos y darle importancia también a la parte de la programación.

Así que el objetivo de este artículo, es tratar de dar una pequeña orientación para aquellos que desean empezar a desarrollar videojuegos y tengan preguntas parecidas a las que tenía yo cuando empecé.

¿Qué se necesita saber para desarrollar videojuegos?
Programación. Lo primero que se necesita es saber programar en algún lenguaje orientado a objetos, yo en lo personal uso C++, pero también se puede utilizar C#, Delphi, Java, etcétera. En cuanto a compiladores, no hay gran diferencia, se pueden utilizar el Visual C++ 2005 Express Edition de Microsoft o el C++ de Borland.

Game Engines. Los juegos generalmente tienen módulos clave para manejar tareas como mostrar gráficas, manejar recursos, interpretar y ejecutar scripts, reproducir efectos de sonido, manejar la inteligencia artificial, manejar el input del usuario. Estos módulos clave, junto con otros, forman de manera colectiva lo que se llama un Game Engine, un producto que ofrece todas estas características, y hay quienes las usan para ahorrarse algo de trabajo al programar. De hecho, los estudios dedicados a los videojuegos, utilizan Game Engines comerciales o desarrolladas por ellos mismos. Utilizar un Game Engine cuando se está iniciando en la programación de videojuegos, podría ser una limitante hasta cierto punto, porque primero se tendría que estudiar la documentación de ésta para saber utilizarla y si no se tienen los fundamentos teóricos suficientes, cuando se quiera modificar una parte del engine para adaptarla al juego deseado, será mucho más difícil. Existe una gran variedad de engines, desde algunas gratuitas y/o, open source como Irrlicht, hasta otras comerciales como el Unreal Engine 3, cuyo licenciamiento puede rebasar los cien mil dólares.

Matemáticas. Es deseable tener conocimientos generales de álgebra lineal y trigonometría, sobre todo para el área de programación de gráficas. Si no se tienen estos conocimientos, se tendrán que aprender al mismo tiempo que se hace con la teoría y programación de gráficas.

¿Qué se necesita aprender para desarrollar videojuegos?
Esta pregunta no es fácil de contestar, sobre todo porque existen diferentes áreas dentro de la programación de videojuegos: gráficas, redes, inteligencia artificial, sonido, lógica principal.
El área en el que está centrado este artículo es en la de gráficas, y para esta área se necesitan aprender básicamente dos cosas:

•Teoría de gráficas: involucra aprender las bases de los sistemas de coordenadas 2D y 3D, las bases de los objetos 3D que son representados como modelos poligonales (vértices, normales, caras, etcétera); las báses de la arquitectura gráfica (diferentes tipos de transformaciones y proyecciones); las matemáticas involucradas (vectores, planos, matrices y todas sus operaciones relacionadas). Diferentes modelos de iluminación, mapeado de texturas, entre otras cosas. Es necesario tener estos conocimientos, ya que se aplican a las APIs para programación gráfica existentes y son necesarios para explotar todo su potencial.

•Una API para programación de gráficas: que es básicamente una librería que usamos en nuestro código para poder mandar gráficas a la pantalla, sin tener que accesar al hardware directamente (en su lugar, los drivers se encargan de procesar las peticiones hechas por las APIs). Las dos APIs de gráficas más usadas son OpenGL y Direct3D, y dado que los resultados que se pueden obtener con ellas, son, hasta cierto punto similares, la elección de una u otra es cuestión personal.

¿Qué es DirectX?
DirectX es una serie de APIs de Microsoft para manejo de gráficas, input del usuario, sonido, video, y funciones de redes que se pueden usar en aplicaciones de multimedia en general, no solamente juegos. En versiones anteriores de DirectX, las gráficas 2D y 3D se manejaban con las APIs DirectDraw y Direct3D, respectivamente. A partir de DirectX 8, éstas se fusionaron en DirectX Graphics, pero es mejor conocida como Direct3D.

¿Qué es OpenGL?
OpenGL es una API para el manejo de gráficas exclusivamente, no tiene otro tipo de funciones utilizadas en los juegos. OpenGL es multiplataforma, lo que significa que el mismo código puede correr en Windows, Mac, X Window, con mínimas modificaciones. Esta es una de las ventajas que, puede decirse, tiene con respecto a Direct3D, el cual es exclusivamente para Windows.

Dado que OpenGL es multiplataforma, no incluye comandos para manejo de ventanas, porque estos son diferentes en cada caso. Dependiendo de la plataforma, hay métodos para crear una ventana con soporte para OpenGL. Para agilizar o hacer más fácil el manejo de ventanas. Ya existen algunas librerías que se utilizan junto con OpenGL, por ejemplo: SDL y GLUT.

OpenGL, a diferencia de DirectX, no se baja como un paquete, de algún sitio de Internet, ya que es implementado por los drivers. Todas las máquinas con Windows 95 o posterior, incluyen los drivers de OpenGL 1.1, aunque la versión más reciente de OpenGL es 2.0 –Windows Vista tendrá los drivers de OpenGL 1.4–. Entonces, la versión de OpenGL que se tenga, depende de dos cosas: la primera es nuestra tarjeta de video –no todas las tarjetas soportan las últimas versiones de OpenGL –, y la segunda, es actualizar los drivers de nuestra tarjeta de video para tener la versión más reciente que soporte la tarjeta.

Para utilizar OpenGL, es necesario configurar nuestro compilador para que pueda encontrar la libreria (OpenGL32.lib) y los archivos de encabezado (gl.h, glu.h, glaux.h) de OpenGL. Así mismo, necesitamos incluir los archivos de encabezado en los archivos de código fuente donde se usen funciones de OpenGL.

¿Cómo puedo programar videojuegos para Xbox360, PlayStation 3, GameCube?

En el caso de Xbox360, para desarrollar un juego se necesita obtener un “Kit de Desarrollo”, que consta de una consola Xbox360 especial para desarrollo, herramientas, SDKs, y documentación. El desarrollo se hace en una PC con Visual Studio o CodeWarrior por ejemplo. Dicha PC está conectada a la consola especial de desarrollo, generalmente por ethernet. Una vez compilado el código, éste se pasa a la consola; la forma de cómo hacerlo, depende de cada sistema. En Xbox, se cuenta con unos plugins en Visual Studio que copian los datos de la PC al disco duro del Xbox, y después el Xbox monta el directorio que se copió, como si fuera el disco duro interno, para empezar a correr el juego.

Para obtener el kit de desarrollo, se necesita ser un desarrollador registrado con Microsoft, y los kits son muy caros. Aunque existe el XNA Game Studio Express, éste, no es suficiente para hacer juegos comerciales, en realidad, es un producto dirigido más para estudiantes y hobbyists. Además, para ser aceptado como desarrollador, se debe seguir un proceso que está sujeto a aceptación por parte de Microsoft. Se puede encontrar más información en:
www.xbox.com/en-us/dev/ default.htm

Otros fabricantes de consolas piden requisitos adicionales. Por ejemplo, Nintendo pide que se cuente con respaldo financiero de algún distribuidor de juegos internacional. Así que, en general, para desarrollar un videojuego para consolas, se necesita tener una compañía establecida con presupuesto suficiente.

Si quieres aprender cómo es el desarrollo para consolas, una muy recomendada para empezar sería Gameboy Advance (GBA), ya que es de las menos complejas. En el sitio www.jharbour.com/gameboy/default.aspx se encuentra gratuitamente el ebook “Programming The Nintendo Game Boy Advance”, que nunca se publicó como libro debido a cuestiones legales. En éste, se encuentra información de cómo ejecutar nuestros propios juegos de GBA en una PC, usando un emulador, así como información de cómo correrlos en una consola GBAreal.



Referencias en línea

Algunos links con mucha información son los siguientes:
www.opengl.org – El sitio oficial de OpenGL, tiene documentación y foros de OpenGL para principiantes y avanzados.

msdn.microsoft.com/library/en-us/directx9_c/directx_sdk.asp – Información de DirectX.

www.gamedev.net – Un sitio con mucha documentación de desarrollo de juegos en general y foros para los diferentes aspectos del desarrollo.

www.gamasutra.com – Un sitio donde se pueden encontrar las más recientes noticias de la industria de los videojuegos, pero también cuenta con algo de información técnica.

www.flipcode.com – Un sitio que ya no se mantiene por sus creadores, pero tiene una extensa colección de artículos, todavía en línea, relacionados al desarrollo de videojuegos.

¿Qué libros me pueden servir?
La tabla en la parte superior de esta página lista algunos libros que considero buenos y que son útiles, independientemente del nivel de conocimiento de programación de videojuegos que se tenga. Como ya lo había mencionado, hasta el momento, no sé de algun libro que enseñe todo lo relacionado al desarrollo de videojuegos, así que los categoricé en 6 grupos principales, y por razones de espacio, sólo menciono unos cuantos de cada categoría.

¿Qué tarjeta gráfica me puede servir para empezar?
El mercado de las tarjetas gráficas es dominado por dos compañías, ATI y NVIDIA. Las dos ofrecen tarjetas gráficas de muy buena calidad y de una gran variedad de precios, dependiendo de la generación de la tarjeta. Muchas veces, al ver las cajas de las tarjetas pueden surgir más preguntas, ya que la información que tienen, puede parecer extraña. Por ejemplo, es importante entender lo que son los Shaders.

Shaders: hasta hace algunos años, se decía que las tarjetas gráficas tenían una arquitectura fija (Fixed-Function Pipeline) ya que la información enviada desde la aplicación, siempre pasaba por las mismas operaciones dentro de la tarjeta gráfica. Esto ha cambiado, y actualmente las tarjetas gráficas tienen una arquitectura programable.

Una arquitectura programable significa que desde la aplicación, se le puede indicar a la tarjeta gráfica que ejecute ciertos programas pequeños (llamados Shaders) ella misma, liberando al CPU completamente de ejecutar esas funciones. Es por esto que las tarjetas gráficas actuales, cuentan con su propia memoria y procesador, conocido como GPU (Graphics Processing Unit). Muchos de los efectos visuales avanzados que vemos en los juegos de hoy en día, son implementados por medio de Shaders.

Hace algunos años, los Shaders eran escritos en lenguaje ensamblador, por tal razón no eran tan populares. Actualmente la mayoría de los Shaders, son escritos en lenguajes de “alto nivel”, muy parecidos a C, los tres más usados son: GLSL (específico de OpenGL); HLSL (específico de DirectX) y Cg (puede correr ya sea en OpenGL o DirectX).

Las tarjetas gráficas con arquitectura programable tienen dos núcleos o procesadores programables, uno se ejecuta a nivel de objetos y otro se ejecuta a nivel de pixeles. Los Shaders que se pueden ejecutar en ellos, se conocen como Vertex Shaders y Pixel Shaders respectivamente (los últimos también se conocen como Fragment Shaders).

Las tarjetas gráficas con arquitectura programable, también tienen soporte para la arquitectura fija, y es decisión de la aplicación, utilizar una u otra arquitectura o incluso utilizar las dos. Es por eso que muchas veces, aunque tengamos un procesador avanzado, si no tenemos una tarjeta gráfica con arquitectura programable como lo requieren algunos juegos, no podremos ejecutarlos.

Tips generales
•Es más fácil empezar por 2D, y algunas cosas de 2D se aplican a 3D también.
•Es más sencillo aprender OpenGL que DirectX (en mi opinión).
•Jugar muchos juegos. Es la mejor manera de sacar ideas para juegos nuevos.
•Ayudar a otros. También se aprende mucho cuando se enseña.
•Tratar de hacer un clon de algún juego 2D sencillo (Tetris, Pong) y después mejorarlo.
•Para un juego 3D, es más rápido desarrollarlo en equipo.

Conclusión
El tema de desarrollo de videojuegos es muy extenso, pero espero haber respondido las preguntas básicas acerca de cómo empezar. El siguiente artículo tiene información mas específica en cuanto a la estructura de un juego. Si dejé alguna pregunta sin responder, me pueden contactar en joel.villagrana@gmail.com y trataré de responder lo más pronto posible.

Acerca del autor
Joel Villagrana, egresado de la Universidad de Guadalajara como Ingeniero en Computación, ha estado en contacto con la programación de videojuegos desde hace 4 años cuando estudió una maestría en Ambientes Virtuales en Inglaterra. Actualmente trabaja para IBM, pero en su tiempo libre sigue aprendiendo las nuevas técnicas de gráficas 3D. Participó en el libro “More OpenGL Game Programming”, publicado en 2005. Recientemente participó en Creanimax 2006. La información de estos artículos representa su punto de vista y no necesariamente el de IBM Corporation. joel.villagrana@gmail.com