Nibelheim

24 septiembre 2006

Desarrollo de videojuegos en Linux-Diseño II

En la anterior entrada hemos dejado planteadas una serie de cuestiones que tenemos que resolver antes de empezar a programar.

Empecemos a plantear la cuestión de los tipos de gráficos. Si vamos hacerlo en 2D en Linux hay una serie de librerías que nos van a servir de base. La más conocida y utilizada es la Simple DirectMedia Layer.

Anteriormente he hablado de DirectX y de Direct3d. Muchas veces se hace el error de comparar OpenGL con DirectX cuando realmente la comparación correcta es OpenGLvsDirect3D. DirectX es una colección de API creadas para facilitar tareas multimedia, un componente suyo, Direct3D se encarga de los gráficos en 3D y se aprovecha de la aceleración por hardware de las tarjetas gráficas haciendo de interfaz entre el programador y la tarjeta de video.

Volviendo al tema de la SDL, podemos compararla con DirectX salvo por el tema de los gráficos en 3D. De esta manera al ser una librería multimedia nos va a dar acceso a programar con ella los gráficos en 2D, pero es que además sirve para el tema del sonido, input (teclado, ratón, joystick), cdrom, video con mpeg, etc... Además han programado algunas "extensiones" como SDL_net que junto a la SDL nos permite desarrollar aplicaciones que hagan uso de conexiones de red. Además de C y C++, que son los lenguajes más comunes para usarlas, tienen bindings para otros lenguajes como puede ser Python, Perl, etc... Otra ventaja que tiene es que es multiplataforma y esta portada a gran cantidad de sistemas operativos (Windows, Linux, FreeBSD, Solaris, etc...). Tiene una buena documentación, han salido incluso libros al mercado, con tutoriales y con el API bien documentado. Además se utiliza no solo en desarrollos amateur sino también en juegos como Quake 4 (La explicación más abajo).

El inconveniente de esta estupenda librería es que es de bajo nivel por lo no vamos a tener facilidades de otras librerias de más alto nivel. Por ejemplo no tenemos colisiones cosas que otras librerias de más alto nivel que si proporcionan otra como puede ser ClanLib.

Otra alternativa en el campo de las 2D, sobre todo para gente que tanto C, como C++, se le hace dificil, es el de utilizar un lenguaje de programación como Fenix. Lo que le hace especial es que es una alternativa libre al lenguaje DIV. Tanto Fenix como DIV son lenguajes creados especialmente para desarrollar videojuegos. Esto hace que en el propio lenguaje tenga soporte para cargar imagenes, colisiones, manejo de sonido, input, sin necesidad de utilizar ninguna librerias. La pega es que tienen un rendimiento muy pobre y que al ser lenguajes creados especificamente para los videojuegos suelen ser mucho peor diseñados que otros de proposito general. Sin embargo cualquiera sin apenas conocimientos de programación puede hacer cosas interesantes y de forma muy rápida. Aquí teneís un manual de fenix algo atrasado pero que tiene utilidad fenix-ref.pdf

Ahora pasemos al tema de las 3D. Tenemos varias alternativas y de buena calidad. La primera es utilizar OpenGL para desarrollar nuestro propio engine. Como es una libreria de bajo nivel, nos da primitivas para cosas muy simples como puntos,lineas, poligonos, por lo que vamos a tener que programar todo desde cero. Podemos acompañarla con la libreria SDL y asi tenemos una alternativa perfectamente valida a DirectX. Puesto que juntamos lo que le faltaba a SDL con lo que le falta a OpenGL.

Sin embargo como desarrollar un engine propio es lento, costoso, y dificil, no vamos a reinventar la rueda y vamos a ver engines ya hechos que nos ayuden a programar un videojuego.

CrystalSpace es muy conocido por ser el engine utilizado en el juego planeshift. Es de los más completos engines opensource. Soporta multitextura, LOD, animación de los mesh mediante libcal3d, sprites 2D, sistema de partículas, físicas con ODE, multiplataforma etc ... El inconveniente que tiene es que tiene poca documentación en forma de tutoriales por lo que tiene una curva alta de aprendizaje. De todas formas jorrit (uno de sus creadores) es consciente de ello, asi que me supongo que harán todo lo que puedan por solucionarlo. Aquí teneís un ejemplo de lo que se puede conseguir con CrystalSpace:

Imagen templo del juego planeshift con gráficos desarrollados con el CrystalSpace



Ogre3D es otro engine, pero esta vez solo funciona como librería 3D, es decir, solo sirve para los gráficos, tal y como dicen en su web, ni sonido, ni IA, ni proporciona físicas. Sin embargo tiene la ventaja de ser más facil de utilizar que el anterior y de tener una buena documentación con guias de iniciación, tutoriales, etc... Además podemos utilizar en conjunción de otras librerías para tener sonido, físicas, según necesitemos. Por supuesto dentro tiene características muy interesantes como el uso de shaders, ser multiplataforma, LOD, sistema de partículas, HDR etc.. Un ejemplo de como usa la iluminación con HDR lo podeís ver en la siguiente imagen:

efecto HDR con Ogre3D


Ya por último nos queda Irrlicht. Este no lo voy a comentar porque lo vamos a utilizar en los próximos artículos para programar gráficos en 3D. Aun así os dejo este video para que veaís las posibilidades que ofrece este engine.


23 septiembre 2006

Desarrollo de videojuegos en Linux-Diseño I

Seguimos con la segunda entrega de esta serie de artículos referidos a la programación de videojuegos en Linux. Hasta ahora no hemos visto nada de programación, y malas noticias para los impacientes, en esta tampoco vamos a ver ningúna linea de código ;)

Pero todo llegará, no os impacienteís, porque no se puede empezar la casa por el tejado. En el anterior artículo Desarrollo de videojuegos en Linux-Introducción hice un análisis un tanto superficial, pero que espero que haya aclarado algunas de las razones por las que en Linux no hay apoyo de la industría de los videojuegos, del estado de los juegos en Linux.

Desarrollar un videojuego es una de las tareas más complejas y que más campos puede abarcar a la hora de programar y diseñarlo. Tenemos que saber de gráficos, y no me refiero a programarlos, sino también a crear ese contenido, por lo que se necesitan grafistas, también en cualquier videojuego necesitamos efectos de sonido, por lo que podemos necesitar alguna herramienta de edición, no puede faltar música para ambientar nuestro videojuego, por lo que necesitaremos una banda sonora, y no hay que dejar de lado el estudio de la ambientación. Si vamos hacer un juego por ejemplo sobre samurais no nos va quedar más remedio que estudiar sus vestimentas, costumbres, contexto histórico, todo para dar una ambientación realista al jugador.

Todo esto encima es ajeno a nuestra tarea de programadores. Pero si vamos a nuestro campo, que es el de programar, nos vamos a ver envueltos, no en pocas dificultades. Lo más obvio es que debemos aprender a programar gráficos. Y luego vienen la física (colisiones, fricción, etc...), la inteligencia artíficial, el sonido, el juego en red, etc... No os extrañe por tanto la cantidad de tiempo y dinero que se necesita para desarrollar un videojuego.

Ahora que os he advertido de los problemas, espero que no os haya quitado las ganas, vienen las soluciones. Lo primero que hay que hacer antes de ponerse a programar es plantear un diseño previo de nuestro videojuego. Empezamos por los requisitos que debe cumplir nuestro programa. ¿A que me refiero con requisitos?, pues digamos aunque no es exactamente eso, que van a ser una serie de objetivos que vamos a intentar cumplir.

Esos objetivos que nos planteamos tienen que ser realistas, y en nuestro caso como aficionados, sin casi recursos, tenemos que tenerlos muy en cuenta. Lo primero es valorar nuestras aptitudes. Que conocimientos tenemos es importante antes de meternos en vereda. Si somos programadores pero no tenemos ni idea de dibujo, vamos a tener un problema a la hora de hacer los gráficos por lo que no podemos ser muy ambiciosos en este tema. Igual pasa con la música sino somos compositores. Encambio para los grafistas, que no tengan ni idea de programar, van a tener que empezar utilizando lenguajes muy sencillos y poco potentes, asi que lo va na tener que suplir con un buen contenido artístico y originalidad.

Otra cosa que tenemos que darnos cuenta es que no podemos empezar por un proyecto demasiado complejo ni que este encima de nuestras posibilidades. Hay que ponernos un tope de tiempo, es decir, debemos estimar la duración que nos va a llevar. Como seguramente nos toque aprender nuevos lenguajes y herramientas, tambien lo debemos tener en cuenta a la hora de cuantificar ese tiempo. Los proyectos largos y ambiciosos normalmente se estancan y no llegan a buen puerto. Los pequeños, aunque no sean gran cosa, sabemos que podremos terminarlos y nos servirán de experiencia para otros más dificiles.

Ahora que ya hemos hablado de la importancia de saber los recursos que contamos, la importancia de estimar y planificar el tiempo, vamos con cosas más concretas:

-Tipo de juego que vamos a crear: rpg, first person shot, plataformas, puzzle, estrategia, aventura gráfica, carreras, simulador, etc..
-Gráficos en 2D o en 3D: algunos tipos de videojuegos quedan mejor en 3D que en 2D. Por contra el 2D tiene más personalidad y con cuidado se pueden hacer muy buenos diseños.
-Requisitos hardware: hay que tener en cuenta que si queremos que funcionen en ordenadores poco potentes tendremos que sacrificar ciertos efectos gráficos y dejaremos sin aprovechar las capacidades y efectos de las tarjetas modernas. Por otra parte si pedimos muchos recursos para ejecutarlos reducimos la base de jugadores potenciales.
-Requisitos software: debemos desde el principio resolver el tema de en que sistemas operativos se va a poder ejecutar el videojuego porque si lo dejamos para el final podemos encontrarnos con el problema de que nos toca rehacer todo el código.
-Número de jugadores: es imporante desde el principio saber si vamos a enfocar el juego al multijugador en red, a pantalla partida, o si por contra lo vamos a hacer de un único jugador. También importante planificar los modos de juego.

Todas estás cuestiones caen dentro de lo que habiamos planteado como requisitos. Sin embargo todavía quedan más cosas que plantear, aunque eso lo dejamos para el siguiente artículo. Como avance os puedo decir que ya vamos a entrar en explicar las diferentes posibilidades que tenemos en Linux a la hora de programar, tanto lenguajes, como librerias y engines que nos van a facilitar la tarea.

Por otra parte me gustaría que comentarais los artículos, hagaís preguntas, en definitiva que os impliqueís para poder mejorarlos o aportar nuevas ideas. Aunque muchas veces no os voy a contestar directamente, si que lo tendré en cuenta para los siguientes entradas que haga.

Salu2



20 septiembre 2006

Desarrollo de videojuegos en Linux-Introducción

Los videojuegos están en auge. Cada vez se invierte más dinero e incluso los volumenes de negocio se acercan a la industria cinematográfica. Hoy en día hacer un videojuego para la PS3 o la XBOX 360, pretendiéndose que sea un must-have requiere inversiones cercanas a los 10 millones de euros, y con tiempos de desarrollo que pueden variar de 2 hasta incluso 4 años.

Pasando a ordenadores, más en concreto al mundo de Linux, ¿Cuales son los juegos que nos encontramos? Pues se puede decir que la industria de videojuegos en Linux es más bien testimonial. El escaso porcentaje de usuarios de escritorio en Linux hace que las compañías no apuesten por versionar, o sacar en exclusiva sus productos. Por lo que hay muy poca oferta comercial. Claro esta hay excepciones como puede ser Doom3, la saga Quake, la saga UT, buenos juegos y lo mejor de todo, que demuestran que en Linux se pueden hacer juegos con gráficos impactantes y que sus engines tienen versiones para Linux, por lo que se podrían reutilizar para hacer juegos profesionales.

Otro problema es Windows. La compañía Microsoft nunca ha estado interesada en la compatibilidad con otros sistemas operativos. Su negocio se basa fuertemente en la implantación de sus sistemas y luego en crear aplicaciones que atan a sus sistemas operativos. Un ejemplo de esto es DirectX. En vez de intentar crear la mejor API posible para la creación de videojuegos como haría cualquier compañía que basara su negocio en eso, en la compañía de Redmon supeditan la calidad (no es que sea mala sino que cortan sus posibilidades) a otros intereses como puede ser la expansión o el mantenimiento de la cuota de mercado de sus Windows. Esto hace que DirectX solo se encuentre disponible para los sistemas de Microsoft y que incluso se utilice como excusa para vender nuevas versiones de sistemas operativos. Tal es el caso de DirectX 10 que solo va a tener versión para Windows Vista, dejando de lado al Windows XP, y al 98. Con esto ha conseguido que todos los videojuegos creados con DirectX sean incompatibles y muy costosos de portar a otras plataformas como puede ser Linux.

Por otra parte tenemos OpenGL que es la alternativa a Direct3D (el componente de DirectX encargado de los gráficos 3D), es una API muy consolidada en la industria. No esta controlada por una empresa sino por un consorcio que definen la linea de desarrollo pero que esta abierto a mejoras y extensiones. Por tanto tenemos un estandar del que las empresas pueden hacer sus implementaciones para todo tipo de sistemas operativos (Windows, Linux, MacOSX, FreeBSD, etc...). Hay incluso una versión libre llamada Mesa3d. Juegos como Quake4, Doom3, UT2004, utilizan OpenGL, y una versión modificada llamada OpenGL-ES es lo que se utiliza en la PS3.

A pesar de los problemas eso no quiere decir en absoluto que en Linux no haya juegos muy buenos. Lo que ocurre es que la mayoría de ellos son amateur por lo que por regla general suele tener gráficos menos ambiciosos, que no aprovechan la potencia de los ordenadores actuales. Un ejemplo de juego muy bueno y que engancha mucho es Battle for Wesnoth. Es un juego de estrategia por turnos de corte clásico. Tiene gráficos en 2D pero detallados,bonitos y funcionales. Y para muestra un video:



Pero no solamente se hacen juegos en 2D, también hay juego en 3D muy currados como puede ser el Nexuiz. Es una alternativa a juegos como Quake3. Tiene una jugabilidad parecida y además tiene el interés de que es totalmente libre. Aquí teneís un video para que comprobeís:



Bueno hasta aquí hemos dado un repaso introductorio al tema de los videojuegos en Linux. En la proxima entrega ya me meteré más a fondo en lo que es el desarrollo de videojuegos. Explicaré las diferentes alternativas que tenemos a la hora de programar. Partiendo de los lenguajes de programación que podemos usar, hasta las diferentes librerias y engines que nos pueden resultar útiles.

Salu2

17 septiembre 2006

Hola Mundo!

En este blog voy a escribir principalmente de programación en Python, de Linux, y de mis aficiones como el manga, anime, etc...

Dentro de poco espero tener algo de contenido. Nos vemos pronto.

Salu2