domingo, 20 de septiembre de 2009

Empezando proyecto - escogiendo motor y librerías

Esto seguramente le habrá pasado a más de uno con ganas de hacer su propio juego. Primero, hace años ya, intenté empezar mi propio motor desde cero sólo para terminar llegando a ningún lado. A veces por encontrar problemas que no era capaz de resolver, otras veces porque el código crecía demasiado y después de un tiempo se hacía difícil de entender y por consiguiente difícil de modificar. Después de aceptar que por ese camino no llegas a ningún lado, lo que sigue es buscar software o código que te pueda ayudar a ir un poco más rápido. Así se conoce librerías como allegro o las sdl, directx, etc. Allegro o SDL son buenas opciones si quieres hacer algo en 2D, y si estás familiarizado con c o c++. Si quieres que tu juego tenga gráficos en 3D entonces terminas usando Direct3d o OpenGL. El problema con OpenGL es que el api es de bajo nivel así que para construir un motor de renderizado a partir de OpenGL tienes un largo camino para recorrer. DirectX incluye a demás de Direct3D, DirectSound o DirectInput por lo que se ajusta más a la programación de juegos, pero todavía tienes un largo camino por recorrer para llegar a completar un motor de juego estable y con características atractivas (o por lo menos útiles) y que puedas reusar en otros proyectos.

Así que lo miren por donde lo miren, si quieres terminar un proyecto antes de cumplir 80 años vas a tener que, o reunir un equipo y hacer un motor de juego o bien recurrir a alguno de los motores ya existentes.

Para proyectos simples puedes usar alguna que otra librería sin integrarla a un engine. Creo que fue en el foro de Ogre 3d donde leí que un usuario ponía que no estaba de parte de usar engines genéricos ya que a menudo lo que tienes es un montón de librerías integradas en una interfaz que no siempre se ajusta a tus necesidades, así que es más fácil usar una librería como Ogre y luego escribir sólo la lógica para que el juego llegue a producirse. Estoy de acuerdo con ello para juegos como Tetris o algún puzzle en general. Pero si quieres un juego 3D en tercera persona, un FPS o un RPG sí vas a necesitar un motor. El problema es que un motor genérico no siempre cumple con todos los aspectos del género de juego que estás interesado en crear así que terminarás trabajando a bajo nivel. Esto es lo que quiero evitar a toda costa, el tener que trabajar a bajo nivel. La idea, si eres un desarrollador independiente, es encontrar el software necesario para poder concentrarte sólo en la lógica del juego. Por supuesto, no creo que exista un motor así pero al menos debe haber alguno que te adelante algo de camino y que sea fácil de extender para los casos en que necesites hacer algo a bajo nivel para poder hacer el juego como lo habías imaginado originalmente.

Los motores de juego que he probado

Delta 3D

Creo que voy a empezar hablando de Delta 3D. Es un engine que tiene todas las características que uno podría pedir, al menos en una primera evaluación. Hasta tiene soporte para física. La licencia es LGPL, ¿qué más puede uno pedir? Todo anda bien hasta que te encuentras una placa que no anda bien bajo OpenGL. Y no solo eso, no olvidemos que algunos fabricantes de gráficas (en especial gráficas onboard) no cuidan el soporte de OpenGL cuando actualizan sus drivers. Me pasó con al menos dos placas con video integrado: mi vieja Biostar con video S3G Unichrome Pro IGP y con mi actual placa Asrock con video Intel GMA 3100 (en Windows 7 RC 64 bits, con el driver que ya trae el Windows al instalarlo todo anda bien, pero si dejas actualizar el driver y luego abres Blender verás un montón de errores en los gráficos que antes no estaban allí, como menús que desaparecen, así que siempre miro qué actualizaciones se marcan para instalar, si veo que aparece el driver de video entre ellas creo un punto de restauración, si al dejar actualizar el driver algo se ve mal en Blender entonces restauro mi sistema y desmarco la actualización para que no se vuelva a instalar). Hay que afrontarlo, muchos fabricantes se preocupan sólo por la compatibilidad con Direct3D, así que si quieres asegurarte de que la mayoría de la gente pueda usar tu juego tienes que hacer el renderizado bajo Direct3D si estás en Windows, y si dejas elegir al usuario entre varias opciones, por ejemplo Direct3D o OpenGL, entonces mejor. ¿Cómo le explicas a los usuarios que no deben dejar actualizar sus drivers gráficos para no romper el soporte de OpenGL cuando siempre se les aconseja todo lo contrario? Yo lo soluciono no dejando actualizar mis drivers pero no puedo pedirle eso a otras personas.

Mis únicos tropiezos con este engine fue su incompatibilidad con Direct3D y el hecho de que fallara al compilar algunos tutoriales de la wiki. No pretendo poner la falta de actualización en la documentación como excusa para esto último, si analizo a fondo el api seguro me doy cuenta cómo compilar el código del tutorial haciendo las modificaciones necesarias, pero en ese momento descubrí otro engine y decidí probarlo antes de seguir aprendiendo Delta3D.

NeoAxis

Lo primero que no me gustó fue la licencia, aunque es gratuito para uso no comercial. En lo posible me gustaría usar algún engine LGPL o GPL pero bueno.

Desde que descargué NeoAxis y empecé con los tutoriales en unos cuantos días hice lo mismo que en varias semanas con Delta3D. Esto me motivó a seguir con este engine a pesar de la licencia y de que no se puede compilar en Linux (hasta donde sé). Sería genial si el juego corriera también en otras plataformas además de Windows así las personas que no quieren tener una pc con arranque dual pueden usar el juego sin tener que reiniciar el equipo. Decidí probar NeoAxis cuando me enteré de que el renderizado lo hacía a través de Ogre3D. Ogre3D siempre ha sido mi motor de renderizado favorito, además de que te permite usar Direct3D o OpenGL y el usuario puede alternar entre uno y otro (aunque no tiene modo software como Irrlicht). Desde que conozco Ogre3D he querido usarlo en mis proyectos pero para un juego de cierta complejidad está el problema de que Ogre3D no es un game engine, es sólo un motor de renderizado, renderiza escenas y nada más, así que si quieres hacer un juego deberás hacer tu propio engine. Ya había oído hablar de engines basados en Ogre3D pero ninguno me pareció tan maduro como NeoAxis. Lo único que no es C++ sino C#, lenguaje que conozco poco pero aún así lo sigo prefiriendo y sigo pensando que es el engine que me ahorrará más tiempo.

Lo que busco es no tener que trabajar nunca a bajo nivel. Algún día fundaré un proyecto para crear un game engine bajo LGPL basado en Ogre3D que sea la materialización del sueño de todo desarrollador independiente pero por ahora quiero hacer un juego completo y terminarlo antes de la siguiente década en lo posible (hasta donde entiendo hoy por hoy la única forma de conseguirlo es precisamente evitar el trabajo a bajo nivel valiéndose del software libre, o al menos gratuito, que anda por la red).

Reality Factory

Seguro más de uno está de acuerdo conmigo en esto. La primera impresión fue de desconfianza. "Games Without Programming". Lo primero que pensé al leer eso fue: lento, poco control sobre el aspecto del juego, juegos que se parecen demasiado unos a otros. Bien, esto no es tan cierto, se pueden crear buenos juegos con Reality Factory, pero creo que por ahora paso. La idea es también lucir un poco mi habilidad de escribir código. Ya que si algún día integrara un equipo serio de desarrollo de juegos el lugar que quisiera ocupar es precisamente el de programador, ya sea de la parte gráfica o bien en la lógica del juego. De programación de red se muy poco, así que llegado el momento buscaré a alguien que pueda encargarse de esa area. Alguna vez traté de escribir un script en Python para interactuar con una web y poco más. Así que descarto Reality Factory por ahora, no obstante decidí mencionarlo aquí por una razón: a diferencia de tantos engines que andan por ahí que todavía no alcanzan su primera versión estable Reality Factory es, hasta donde entiendo, un producto bastante completo que puede permitirte crear un juego entero, mientras no te importe el soporte de red, o la compatibilidad multi plataforma. Así que si se está muy apurado se debería considerar siempre como una opción. También es importante hacer notar que no es sólo un motor sino, como se lo define en su página, a game creation suite. También es posible acceder al código fuente sin pagar licencias en el caso de que el proyecto lo requiera.

Otros Engines

Todos descartados por una razón obvia, la licencia. Cuenta la historia que en mi país hay gente que puede pagarlas, pero yo no conozco a nadie todavía, excepto quizá algún desarrollador profesional que viva de eso. Aún si esos engines fueran accesibles para mi, no sé si los usaría, el tema del software libre es muy importante, y yo apoyo su filosofía. Por eso siempre trato de hacerlo todo usando software libre en los casos en que es posible.

Después de leer la última línea debes preguntarte: Todo bien mientras no quieras hacer dinero con tus juegos, ¿pero qué haces cuando sí quieres obtener remuneración? En el caso de aplicaciones en general puedes vender soporte técnico, incluso vender entrenamiento para que otros puedan dedicarse a dar soporte de esa aplicación (en el caso de que llegue a ser algo realmente grande y popular). Pero con los juegos no se necesita soporte así que no hay nada que justifique que obtengas alguna remuneración, excepto por las donaciones. En realidad, esto último no es del todo cierto, a mí se me ocurren un par de ideas que daré a conocer en otra entrada.

Decisión

NeoAxis será el engine que utilice para mi proyecto.

0 comentarios:

Publicar un comentario