Hola a todos...
He aquí la primera entrega "Como crear tu propio motor de videojuegos y no morir en el intento".
Antes que nada hay que dejar un par de puntos muy claros:
- Para mi es un proyecto vital, es decir, me podré estar toda la vida haciendolo y esto es un hecho que asumo debido a que quiero aprender, no a acabar un producto en un tiempo determinado. Lo digo por que en muchas ocasiones existe el fenomeno "esto lo acabo en 1 semana" muy propio de los novatines, que acostumbra a acabar en tragedia y lloros (y como daño colateral, abandonar el proyecto)
- En la medida de lo posible no usaré librerias de terceros (aunque si API's y algún que otro código suelto). Esto es debido a que por un lado no aprenderiamos (que entiendo que es nuestro objetivo principal) y por otro lado siempre podemos tener sorpresas desagradables con las licencias. No obstante, que yo no use librerias no significa que vosotros no podais, la idea es que el diseño del motor sea lo suficientemente solido y modular como para aceptar cambios de bloques enteros sin modificar la funcionalidad total.
Una vez dicho esto, pongamonos a trabajar.
El motor lo implementaré en C++ y aquí si que hay poca discusión. Soy un enamorado rematado de C y de ASM, pero en cuanto a modularidad C++ no tiene comparación. Como siempre, sois libres de montarlo como querais. Con lo que yo muestre por aquí no deberia haber problema en implementar el motor en Java(por ejemplo)..... aunque, quien en su sano juicio querría hacer eso? :D
Mi entorno de desarrollo es Windows y utilizo VisualStudio. Nuevamente, hacedlo en el compilador que querais ( DevCpp, gcc sobre Linux,etc... ), yo lo mostraré en el que tengo. Si no teneis ninguno en especial creo recordar que existe una versión Express del Visual Studio de gratix...
Como crear el proyecto:
Ahora que está todo dicho, crearemos el proyecto:
- Abrís el Visual Studio y creais un nuevo proyecto.
- Win32 >> Aplicación de consola Win32
- Siguiente
- Marcad "Aplicación de consola" y "Proyecto vacío"
- Finalizar
Las primeras lineas de código:
Ahora tendremos un proyecto mondo y lirondo, absolutamente sin ningun archivo.
Como ya supondreis, lo primero que haremos será crear un archivo que llamaremos main.cpp y otros dos a los que llamaremos Core.h y Core.cpp.
Copiad el siguiente código en los siguiente archivos:
main.cpp
/**************************************************************************************************/
// Código creado por F.Bordas (LordPakus) como ejemplo de creación de un game engine
// para el blog LordPakus (http://lordpakus.blogspot.com/).
// Prohibida la distribución fuera de este blog sin el permiso expreso del autor
/**************************************************************************************************/
/**************************************************************************************************/
// main.cpp : Main de nuestro gameEngine
/**************************************************************************************************/
#include "Core.h"
int main (int argc, char* argv[])
{
//Inicializamos la clase Core con los argumentos del programa
Core::singleton().Init(&argc, argv);
//Empezamos el programa dandole el control al bucle principal de la clase core.
Core::singleton().Run();
//Desinicializamos la clase Core
Core::singleton().DeInit();
}
Core.h
/**************************************************************************************************/
// Código creado por F.Bordas (LordPakus) como ejemplo de creación de un game engine
// para el blog LordPakus (http://lordpakus.blogspot.com/).
// Prohibida la distribución fuera de este blog sin el permiso expreso del autor
/**************************************************************************************************/
/**************************************************************************************************/
// Core.h : Interface del core manager.
// Caracteristicas especiales: Esta clase implementa un singleton, es decir, solo podrá existir un objeto de esta clase en todo el proyecto
/**************************************************************************************************/
#ifndef __Core__
#define __Core__
class Core
{
private:
// Constructor y destructor de la clase
static Core instance;
Core();
~Core();
public:
static Core& singleton();
public:
//Funcion para inicializar el bucle principal
void Init(int* argc, char* argv[]);
//Funcion para ejecutar el bucle principal
void Run();
//Funcion para desinicializar el bucle principal
void DeInit();
private:
};
#endif
Core.cpp
/**************************************************************************************************/
// Código creado por F.Bordas (LordPakus) como ejemplo de creación de un game engine
// para el blog LordPakus (http://lordpakus.blogspot.com/).
// Prohibida la distribución fuera de este blog sin el permiso expreso del autor
/**************************************************************************************************/
/**************************************************************************************************/
// Core.cpp : Código del core manager.
/**************************************************************************************************/
#include "Core.h"
#include <iostream> //Usada para imprimir por consola
using namespace std;
//Instancia única del core manager
Core Core::instance;
//Constructor
Core::Core()
{
}
//Destructor
Core::~Core()
{
}
//Devolvemos el puntero al singleton
Core& Core::singleton()
{
return instance;
}
//Funcion para inicializar el bucle principal
void Core::Init(int* argc, char* argv[])
{
cout << "Inicializamos el Core Manager\n";
}
//Funcion para ejecutar el bucle principal
void Core::Run()
{
//Variable usada de iterador
int i = 0;
//Bucle fool para comprovar el funcionamiento de la clase core...
for( i = 0 ; i < 1000000; ++i)
{
if(!(i%10000))
cout << "Ejecutamos el paso de core numero: " << (i/10000) << "\n";
}
}
//Funcion para desinicializar el bucle principal
void Core::DeInit()
{
cout << "Desinicializamos el Core Manager\n";
}
Ahora compilad (no os deberia dar ningún error) Como los más avispados ya supondréis si ejecutáis el exe resultante en una ventana de cmd el resultado que debereis ver será:
Inicializamos el Core Manager
Ejecutamos el paso de core numero: 0
Ejecutamos el paso de core numero: 1
Ejecutamos el paso de core numero: 2
….
Ejecutamos el paso de core numero: 98
Ejecutamos el paso de core numero: 99
Desinicializamos el Core Manager
Y por hoy hasta aquí llegamos, tal vez os parezca poco, pero sin lo que se ha explicado no se podría desarrollar el resto del proyecto. Si habéis tenido problemas para entender el código, googlead, es imprescindible entender este código a la perfección debido a que es muy sencillo y la complejidad no va ha hacer más que incrementarse. Y bueno, dudas y sugerencias, para esto teneis el blog.
Nos vemos, hasta el siguiente capítulo.
