B. Identificación de herramientas de software
Herramientas necesarias
Ahora veremos que herramientas son necesarias para convertirse en un desarrollador de videojuegos. Antes que todo necesitamos manejar algún lenguaje de programación, entre mejor sea el nivel de conocimiento que tengamos de aquel lenguaje más rápido avanzaremos.
El lenguaje por excelencia usado en la historia del desarrollo de los videojuegos profesionales ha sido C y desde la última década el gran Dios es C++, debido a las ventajas que este posee, ya que hace uso del paradigma de la programación orientada a objetos, aunque también podemos usar características de la programación procedural de C.
Pero no solo basta con conocer un lenguaje de programación para que nuestras ideas de lo que queremos que realice el juego sean escritas en este lenguaje, sino que también necesitamos “algo” que nos transforme todo ese código que solo entienden los humanos a otro código que entienden las máquinas, estamos hablando del famoso compilador que realiza esta conversión a ceros y unos. Existen compiladores para cada tipo de lenguaje y estos pueden ser gratuitos o comerciales.
Ya dijimos que la mayoría de los proyectos son realizados en C/C++ pero hay otras alternativas, existen lenguajes compilados e interpretados. Ejemplo de un lenguaje compilado es C/C++, ejemplo de lenguajes interpretados (en vez de un compilador necesitan de un interprete para funcionar) son Python, Basic, etc.
Como ejemplo de compilador tenemos a MinGW (Minimalist GNU for Windows) el cual es un port del GCC de Linux. Este compilador es gratuito, pero no solo es el compilador, sino que también contiene otras herramientas que nos apoyan en el proceso de desarrollo, como es el linker, make, debugger, profiler, etc.
Además del lenguaje y el compilador, necesitamos un editor de texto donde podamos escribir nuestras líneas de código, es aquí donde aparecen los Entornos de Desarrollo Integrado mas conocido como IDE (Integrated Development Environment). IDE's hay para todos los gustos, pero existe una bastante cómoda de usar y con muy buenas características, estamos hablando de Code::Blocks. También puede ser usado Dev-C++ el cual ya trae en su distribución el compilador GCC, aunque desde hace mucho tiempo no es actualizado. Code::Blocks tiene varias características que lo hace superior a Dev-C++, una de ellas es el visor de funciones, variables, clases y la completación de código, que todo programador agradecerá. Otro Compilador/IDE bastante usado en estos tiempos es Microsoft Visual C++.
Para comenzar conviene saber sobre el manejo de estructuras de datos, esto es parte de los conocimientos básicos que debería tener cualquier programador.
Hoy en día disponemos de un conjunto de bibliotecas que nos facilitan el uso de estructuras de datos en nuestros programas, estamos hablando de la biblioteca STL (Standard Template Library), la cual ya es un standard de C++, y lo podemos encontrar en todos los compiladores actuales.
Para no entrar en detalle sobre esta biblioteca (lo cual debe ser discutido en otro artículo) solo diremos que STL es una colección de estructuras como listas, pilas, colas, vectores, etc. y algoritmos que manejan estas estructuras de forma transparente al programador. Conviene aprender a usarlas ya que nos ahorrarán mucho trabajo y nuestro código quedará más ordenado y elegante.
Podemos hablar también del networking, que es todo lo relacionado con la comunicación de datos a través de redes (acá aparecen términos como sockets, TCP, UDP, etc.). Por ejemplo en todo juego multijugador debemos estar enviando datos de posiciones, puntajes y otras características de personajes, objetos, etc. a otras máquinas para que exista una interacción entre todos los jugadores con el fin de ver reflejado en nuestro PC lo que están haciendo los otros jugadores en sus propios computadores. Esto es usado hoy en día en todos los juegos multijugador, gran ejemplo de esto es Unreal Tournament. En esta área también disponemos de bibliotecas especializadas en el tema, un ejemplo es SDL_Net.
No podemos dejar afuera el scripting, que abarca todo lo relacionado con la generación de archivos scripts, donde cada uno de estos contiene variables, datos y código. Por ejemplo si en un juego necesitamos crear interfaces, o mantener posiciones de ciertos objetos, es más cómodo tener un archivo con esta información y que desde el programa principal se lea el archivo y se interprete, esto facilita mucho la modificación del juego, tanto en el proceso de desarrollo como en futuras actualizaciones, y nos permite liberarnos de estar compilando cada vez que hagamos un cambio en el código fuente. Existen lenguajes de scripting que nos facilitan la vida como Python y LUA. Mediante scripts podemos generar el comportamiento que tendrá un personaje en un juego, a estos personajes se les llama NPC (Non Playing Character).
También debemos aprender Inteligencia Artificial, ¿Qué sería de un juego donde los enemigos se comportan de forma poco “inteligente”?, simplemente no sería divertido jugar, y rápidamente aprenderíamos los movimientos y su comportamiento. Aquí es donde podemos aplicar conocimientos de IA en nuestros juegos, dándole un toque más real y mas entretenido.
APIs Gráficas
Antes de terminar con los conocimientos no podemos dejar de hablar de algo importantísimo, el manejo de una API Gráfica. Una API (Application Programming Interface) o Interfaz de Programación de Aplicaciones, es un conjunto de funciones que realizan tareas específicas facilitando la vida al programador. Al hablar de API grafica nos referimos a un set de funciones para inicializar por ejemplo modos gráficos, realizar copiado de datos de la memoria del computador a la tarjeta de video (blitting), etc. Existen API's especificas para cada tipo de tarea que queramos realizar.
Actualmente las API's Gráficas más usadas son OpenGL y DirectX.
OpenGL (Open Graphics Library) es una API multiplataforma creada por Silicon Graphics en 1992, que maneja solo el aspecto gráfico de un sistema, dejando afuera el sonido, música, control de teclado, mouse, joysticks, gamepads, etc., los que deben ser controlados con otras API's especializadas. Existe una biblioteca multiplataforma para el manejo de audio tridimensional llamada OpenAL (Open Audio Library).
DirectX es una API multimedia creada por Microsoft en 1995, que consta básicamente de Direct3D para la parte gráfica, DirectSound y DirectMusic para la parte de audio, y DirecInput para el control de teclados, joysticks, etc. También incluye DirectPlay para comunicación de datos en redes.
El uso de estas dos API's en un comienzo puede ser un poco complicado y engorroso, especialmente DirectX. Existen algunas alternativas como Allegro o SDL, las que son multiplataforma.
SDL (Simple DirectMedia Layer) es una API gráfica para realizar operaciones de dibujado en 2D, gestionar efectos de sonido y música, y cargar imágenes.
SDL permite básicamente crear aplicaciones en 2D, pero si queremos extender estas capacidades podemos usarla en conjunto con OpenGL, ya sea para crear nuevamente aplicaciones 2D que aprovechen las características de aceleración por hardware, que todas las tarjetas de video poseen hoy en día, como para crear aplicaciones completamente en 3D.
Ya vimos las herramientas y conocimientos necesarios para comenzar en el desarrollo de videojuegos, pero no podemos dejar de mencionar que también existen los Engines o Motores de juego, que están basados en algunas de las API's ya vistas, OpenGL o DirectX principalmente, que proveen al programador todas las funcionalidades necesarias para el desarrollo de un juego.
Básicamente un Engine esta formado por varios sistemas y subsistemas, por ejemplo un sistema gráfico para manejar objetos 2D o 3D, un sistema de control de entrada (teclado, mouse, etc.), sistema de texto, sistema de red, sistema de scripts, sistema de audio, etc. Todos los conocimientos necesarios que vimos antes ahora están aplicados en un Engine. API's Gráficas.
Existen Engines gratuitos (algunos bastante buenos y complejos) y otros comerciales, por ejemplo podemos nombrar los siguientes: Irrlicht, Ogre 3D, Crystal Space 3D, PopCap, Torque, etc.
Para comenzar a desarrollar conviene utilizar algo más sencillo (pero no por eso menos potente). Por ejemplo podríamos usar la dupla SDL/OpenGL junto a otras librerías externas para construir nuestro propio Engine.
No solo es necesario disponer de las herramientas y conocimientos que ya vimos para el desarrollo de juegos, aun hay más, pero esto ya no es tarea del programador (aunque conviene también tener estos conocimientos en forma general por lo menos) estamos hablando del Diseño Gráfico de un juego. Alguien debe ser capaz de realizar las imágenes que aparecerán, ya sea en menús, pantallas de configuración y en el juego mismo.
Los típicos conocimientos que debe tener un diseñador grafico, son el uso de alguna herramienta de retoque fotográfico como Photoshop, Paint Shop Pro o Gimp, y herramientas para modelar objetos 3D tales como 3D Studio Max, Maya, Blender, entre otros.
Y no puede quedar afuera tampoco, algun personaje que componga la música o cree y/o edite los sonidos que aparecerán en el juego. Ejemplo de este tipo de software es Adobe Audition, Acid Pro, Reason, Fruity Loops, etc.
Manejo de conocimientos base
Siguiendo con los conocimientos, también debemos saber matemáticas, no tenemos que ser unos genios en esta área, pero ayuda bastante tener conocimientos de trigonometría y algebra lineal. Para comenzar no es tan necesario saber todo esto, pero mientras los proyectos se van haciendo más complejos, será necesario comenzar a revisar los viejos cuadernos y libros de matemáticas que tenemos guardados.
Si hay que saber matemáticas, no podíamos dejar afuera la física, pilar fundamental para ciertos juegos que simulan micromundos, donde intervienen fuerzas gravitacionales, velocidades, aceleración, masas, en general cualquier variable física. Básicamente en juegos de tipo plataformas como Mario Bross, se aplican ciertas cosas de cinemática básica en los personajes, como en el movimiento que realizan, cuando saltan, caen, etc. y por supuesto todo el tema relacionado con las colisiones y respuesta es parte de la física del juego. Existe una API que nos facilita el manejo de la física, se llama ODE (Open Dynamics Engine) la cual es Open Source.
En lo que se refiere a la Inteligencia artificial, es necesario contar con conocimientos de: algoritmos genéticos, vida artificial, máquinas de estados finitos, árboles de búsqueda, redes neuronales