06 de Junio, 2014
Artículo indiespensable
Indiespensable
Dev Lavde #16 – Hola mundo
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.

Capas Motor

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
  • Yo empecé con python, creo que es una opción con la que es fácil iniciarse. Al fin y al cabo lo mejor es aprender como funciona la lógica y no estar perdiendo el tiempo con particularidades sintácticas.

    Hay un libro muy bueno (“Learning Python the hard way”) que el autor subió a internet de manera gratuita:

    http://learnpythonthehardway.org/book/

    Eso sí, para programar es imprescindible un mínimo nivel de inglés. Facilita entender el código y te permite acceder a muchos libros, manuales y documentación.

    Yo soy un fan incondicional de Construct 2 y lo uso mucho, pero creo que es malo iniciarse directamente ahí. Es cierto que puedes hacer juegos sin programar, pero si cuando empiezas a usarlo sabes pensar como un programador y tienes experiencia previa entonces las posibilidades del motor se disparan. Los que empiezan con el motor directamente no suelen pasar de prototipos muy básicos.

    • Otro aquí que empezó con Python, pero el Learning Python the Hard Way me parece un libro un poco tosco para empezar. Me sirvieron mucho más otros libros de Python como “Practical Programming: An introduction to computer science using Python” y otros más generales como el “Code Complete” o “How to think like a computer scientist”. Eso, algunos cursos, y una cantidad casi infinita de esfuerzo y paciencia.

      • La verdad es que el de “Learning Python the hard way” bien mirado no se para mucho a explicar conceptos de lógica, si se parte de cero puede ser duro.

        También está el proyecto de Code Academy (http://www.codecademy.com/). No sé como estará ahora el proyecto, yo lo probé nada más empezar cuando sólo tenían java. Por lo que recuerdo estaba bastante bien y te obligaba a resolver tú los ejercicios para avanzar, así evitas lo típico de leer algo, pensar:”Yo ya sé hacer eso” y pasar al siguiente.

        A la hora de programar hay mil modos de enseñanza, cada uno defiende el suyo, toca ir probando hasta que encuentras el que te convence.

  • Lector habitual

    Una pregunta quizá algo indiscreta; si un lector habitual de vuestra web que estuviese en sus inicios como desarrollador independiente os pidiese que hicieseis algún tipo de mención a su juego ¿le escucharíais?

    • Ruber Eaglenest

      Te hablo yo en nombre de todos. Es peliagudo (cómo me gusta esta palabra últimamente).

      Verás, a la redacción llegan decenas de juegos a la semana. Teniendo en cuenta que nosotros no hacemos ni noticias, ni notas de prensa, ni previews ni na de na de lo que hacen otras webs, verás que gran parte de lo que entra no puede salir por razones obvias.

      Por otro lado los artículos que salen y sobre los juegos que salen depende de la motivación de cada redactor. Esto es, no escribimos sobre juegos por obligación, sino que escribimos sobre los juegos que nos motivan en cada momento.

      Dicho esto, mándalo, no pierdes nada. Pero no sólo a nosotros, mándalo a todo el mundo. Léete a fondo esta guía:

      http://www.pixelprospector.com/how-to-contact-press/

      Síguela paso a paso. Quizás tu juego sea humilde y consigas sólo un ligero porcentaje de menciones en los sitios especializados… pero eh! eso igualmente es experiencia indie importante.

      Para terminar, como mínimo sí que te podemos rewittear y facebookear, es allí donde damos más salida a los juegos que nos pasan. (y aún así a veces tampoco cumplimos) (y aún así también depende de que nos motive).

      ¡Un saludo!