GDE: Genbeta Dev Engine

Quiero proponer un proyecto a todos los seguidores de Genbeta Dev interesado en el desarrollo de videojuegos. Desarrollar un Game Engine. La idea surge de elaborar una serie de artículos dedicado a las partes más importantes de un motor de videojuegos. Después de varias planteamientos creo que lo mejor es verlo con un ejemplo práctico.

La idea es elaborar un Game Engine básico y sencillo para juegos 2D. Iremos escribiendo artículos y mantendremos un repositorio de código al que todo podamos recurrir y donde serán bienvenidas todas las aportaciones.

No reinventar la rueda

No pretendemos reinventar la rueda y está claro que este Game Engine solo va a tener en un principio fines didácticos, pero trataremos de hacerlo con sentido y bien programado aplicando las técnicas usadas en la industria.

Hay que tener claro lo que queremos y no queremos hacer y la idea es crear un Game Engine para poner en práctica los conocimientos necesarios que están debajo de cada videojuego. No pretendemos hacer un motor gráfico, ni de física, etc. Para esto nos apoyaremos en bibliotecas consolidadas que podamos incorporar a nuestro proyecto y ahorrarnos su implementación. Al final se suele decir que un programador muchas veces se dedica a unir piezas.

Características principales

El proyecto será software libre, por tanto usaremos bibliotecas y tecnologías libres para su implementación. Además queremos que sea multiplataforma en la medida de lo posible. Por lo menos cubrir los tres grandes sistemas de escritorio: Windows, Mac OSX y Linux.

Como lenguaje de programación he escogido C++ por encima de otras opciones tentadoras como Python o Javascript. La decisión de usar C++ es que en el mundo de los videojuegos es el lenguaje de la industria por permitir la eficiencia de C con la programación orientada a objetos. Aunque todos los consejos y técnicas serán válidas en cualquier lenguaje y tecnología. C++ nos permitirá ver los entresijos de la utilización de la memoria y sus buena prácticas de gestión que otros lenguajes nos ocultan.

Otra cosa necesaria es el uso de bibliotecas multimedia. Como dijimos, no es nuestra intención reinventar la rueda. Así que usaremos bibliotecas consolidadas para el manejo multimedia: Gráficos, Sonido, E/S, Red, etc.

Lo primera opción que baraje fue el uso de OpenGL (gráficos), OpenAL (audio) y libOIS (E/S). Pero con el objetivo de mantenerlo simple y unificado me decidí por usar una biblioteca con un nivel de abstracción mayor. Aquí barajé dos opciones: SDL 2 y SFML 2.1. La primera está recien salida y escrita en C y aquí un servidor no la conoce bien. Por otro lado SFML 2.1 ya lleva algo más de tiempo, está escrita en C++ y un servidor a trabajado con ella hasta la saciedad. Es por eso que me decido por esta última. Además SFML tiene la ventaja sobre SDL que no necesita de proyectos externos para que sea completamente funcional.

Así pues nos apoyaremos en SFML para el soporte multimedia ya que nos aporta módulos de gráficos, audio, E/S y red. Así como otras utilidades como clases para el manejo de cadenas y vectores. Algo esencial.

Desde el principio intentaremos que sea lo más modular posible que se puedan añadir y quitar partes del Engine fácilmente según las necesidades del proyecto. Aunque en esta primera parte de elaboración del proyecto nos centraremos en el desarrollo de un módulo básico que los sistemas esenciales de un motor de videojuegos.

Repositorio de código

Hemos creado un repositorio de código en Github. En el irán apareciendo todos los avances del proyecto e irán quedando registrados los avances en cada commit. Así mismo estará abierto para que todos los usuarios de Genbeta Dev puedan hacer fork, corregir errores y aportar contenido. Sería muy positivo la colaboración de todos más allá de los artículos.

Hoja de ruta del proyecto

Lo primero que se debe hacer cuando se aborda un nuevo proyecto es crear el llamado Roadmap que nos define los objetivos a seguir para una determinada versión.

En nuestra primera milestone nos vamos a marcar unos objetivos asequibles y simples que puedan llevarse a cabo y los vamos a pulir. Una vez completada y revisada esta primera milestone correspondiente a la versión 0.1 nos planteareamos abordar nuevas evoluciones del proyecto según el éxito que tenga.

Milestone 0.1

Será la apertura inicial del proyecto que es conseguir un framework básico sobre C++ y SFML 2.1 que nos facilite el desarrollo de videojuegos, las características de esta versión serán las siguiente.

  • Definir una estructura de directorios y los proyectos necesarios. Por un lado tendremos nuestro Framework que lo configuraremos como una biblioteca. Por otro lado tendremos una Aplicación denominada Test que hará uso de nuestra biblioteca para ejecutar diferentes pruebas.

  • Crear una clase principal que gestione el arranque y parada del motor así como la configuración del sistema.

  • Crear un gestor de recursos (Asset Manager).

  • Crear un gestor de escenas (Scene Manager).

Estos serán los puntos principales que abordaremos en la primera versión. Cada uno de ellos luego se subdividirá en varias tareas y clases necesarias para la implementación.

Cuando finalicemos esta primera versión nuestro biblioteca debería trabajar junto a SFML 2.1 para facilitarnos el desarrollo de videojuegos añadiendo una configuración sencilla de la aplicación mendiante archivos de configuración.

Tendrá un gestor de recursos que nos permitirá gestionar eficientemente la memoria y carga de los diferentes recursos que estarán disponibles en la versión 0.1 que serán los siguientes: Imágenes, Texturas, Fuentes, Sonidos, Música, Archivos de configuración (.ini, .cfg).

El gestor de escenas se encargará de gestionar las diferentes escenas, pantallas o estados de un videojuego, lo que nos permitirá ordenar nuestro código y conseguir modularidad.

Así mismo se implementarán clases o funciones auxiliares para la gestión de cadenas y otras utilidades varias que vaya requiriendo el proyeco.

Futuras versiones

En futuras versión añadiremos soporte para más recursos como puedan ser ficheros XML, Shaders o TMX (El formato de mapa del tiled).

Añadiremos clases que nos faciliten el manejo de GameObjects y jerarquía de objetos, soporte para Sprite Sheet y animaciones, Crearemos nuevos tipos de objetos como pueden ser los mapas para manejarlos eficientemente.

También habrá nuevas clases para el manejo de la cámara y el Scroll.

Todo esto iremos incorporándolo poco a poco a lo largo de varias versiones. La idea como ya hemos dicho es trabajar con pocas características por versión para que sean siempre asumibles y queden bien testeadas antes de abordar nuevas features.

El autor (un servidor) ya ha abordado proyectos de esta índole, pero siempre se puede encontrar mejoras, sugerencias y correcciones de los lectores. Es por eso que invito a la comunidad de Genbeta Dev que este interesada en este proyecto en tomarlo como algo colaborativo en el que todo el mundo puede participar ya que será un proyecto de Software Libre. Los comentarios de los diferentes artículos del proyecto así como los issues que iremos poniendo en el proyecto en Github será nuestro medio de comunicación.

En fin esto no ha sido la presentación de un largo proyecto que esperemos que interese a la comunidad. En breve daremos más detalles y comenzaremos a trabajar.

Ver todos los comentarios en https://www.genbeta.com

VER 0 Comentario

Portada de Genbeta