Inicializando el Motor2
De CursosGpl
En esta parte del tutorial haremos exactamente lo mismo que en la anterior, pero vamos a estructurarlo todo mejor para seguir trabajando en las siguientes secciones.
Vamos a definir una clase llamada DelBase con la funcionalidad de la parte anterior, la declaración de la clase está en delbase.h y la implementación en delbase.cpp.
El archivo main.cpp lo limpiaremos para que contenga sólo algunas llamadas a esta clase.
Tabla de contenidos |
[editar] Conceptos
A lo largo del tutorial iremos definiendo una clase que sirva de base para futuras aplicaciones que queramos desarrollar. Esto es muy útil porque así en el futuro para crear una aplicación solo tendremos que crear una clase derivada de esta y derivar las funciones que nos interesen hacia la nuestra, dejando a la clase base que se ocupe de lo básico.
[editar] Programación
[editar] DelBase
Definimos algunas variables del motor interesantes, para tenerlas simplemente accesibles desde nuestra clase.
iObjectRegistry* object_reg; csRef<iEngine> engine; csRef<iLoader> loader; csRef<iGraphics3D> g3d; csRef<iKeyboardDriver> kbd; csRef<iVirtualClock> vc;
Constructor y destructor
DelBase (int argc, char const* argv[]); ~DelBase ();
Varias funciones de entrada
bool Inicializa(int argc, char const* argv[]); bool BuclePrincipal(); bool Finaliza(); bool GestionaEvento (iEvent& ev); static bool GestorDeEventos(iEvent& ev);
Nótese que para el caso de la gestión de eventos hemos definido dos funciones, esto es porque a SetupEventHandler le tenemos que pasar una función estática, y desde esta llamamos a la otra.
Por lo demás no tiene ningún secreto, Inicializa para inicializar los componentes básicos, BuclePrincipal para entrar en el bucle principal y Finaliza para cerrar el motor.
[editar] Código
[editar] main.cpp
#include <cssysdef.h> //debe estar en todos los .cpp #include "csutil/sysfunc.h" #include "delbase.h"
// CS_IMPLEMENT_APPLICATION debe estar al principio de uno de los ficheros de código CS_IMPLEMENT_APPLICATION
// El Puntero Global a la Base DelBase *delbase;
/*-----------------------------* * Función Main * ---------------------------*/
int main(int argc, char const* argv[])
{
delbase = new DelBase (argc, argv);
delbase->BuclePrincipal();
delbase->Finaliza();
return 0; }
[editar] delbase.h
#ifndef __DELBASE_H__ #define __DELBASE_H__
#include <stdarg.h>
struct iEngine; struct iLoader; struct iGraphics3D; struct iKeyboardDriver; struct iSector; struct iView; struct iVirtualClock; struct iObjectRegistry; struct iEvent;
class DelBase
{
private:
iObjectRegistry* object_reg;
csRef<iEngine> engine;
csRef<iLoader> loader;
csRef<iGraphics3D> g3d;
csRef<iKeyboardDriver> kbd;
csRef<iVirtualClock> vc;
float rotX, rotY;
public: DelBase (int argc, char const* argv[]); ~DelBase (); bool Inicializa(int argc, char const* argv[]); bool BuclePrincipal(); bool Finaliza(); bool GestionaEvento (iEvent& ev); static bool GestorDeEventos(iEvent& ev); };
#endif // __DELBASE_H__
[editar] delbase.cpp
#include <cssysdef.h> //debe estar en todos los .cpp #include <iutil/objreg.h> //por el puntero a iObjectRegistry #include <cstool/initapp.h> //Por el csInitializer #include <csutil/sysfunc.h> //por el csDefaultRunLoop #include <csutil/event.h> //por csKeyEventHelper & CO #include <iutil/eventq.h> #include <csutil/cmdhelp.h> //por el csCommandLineHelper #include <iengine/engine.h> // iEngine #include <imap/parser.h> // iLoader #include <ivideo/graph3d.h> // iGraphics3d #include <iutil/csinput.h> // IKeyboardDriver #include <iutil/virtclk.h> // iVirtualClock
#include "delbase.h"
extern DelBase *delbase;
[editar] Constructor y destructor
/*-----------------------------*
* Constructor
* ---------------------------*/
DelBase::DelBase (int argc, char const* argv[])
{
Inicializa(argc, argv);
}
/*-----------------------------*
* Destructor
* ---------------------------*/
DelBase::~DelBase ()
{
}
[editar] Gestión de eventos
/*-----------------------------* * Función De Gestión de Eventos * ---------------------------*/
bool DelBase::GestorDeEventos(iEvent& ev)
{
return delbase->GestionaEvento(ev);
}
bool DelBase::GestionaEvento (iEvent& ev)
{
if (ev.Type == csevKeyboard &&
csKeyEventHelper::GetEventType (&ev) == csKeyEventTypeDown &&
csKeyEventHelper::GetCookedCode (&ev) == CSKEY_ESC)
{
csRef<iEventQueue> q (CS_QUERY_REGISTRY (object_reg, iEventQueue));
if (q)
q->GetEventOutlet()->Broadcast (cscmdQuit);
return true;
}
return false;
}
[editar] Inicializa
/*-----------------------------*
* Función de Inicialización
* ---------------------------*/
bool DelBase::Inicializa(int argc, char const* argv[])
{
int error = 0;
//Crea el Registro de Objetos, el Gestor de Plugins, la cola de Eventos,
//el reloj Virtual, el parseador de linea de Comandos, el gestor de
//configuracion, los drivers de input
object_reg = csInitializer::CreateEnvironment(argc,argv);
//Configura el Gestor de Configuracion indicandole el fichero de configuración.
error = csInitializer::SetupConfigManager(object_reg, "/config/walktest.cfg");
// Carga los plugins
error = csInitializer::RequestPlugins (object_reg,CS_REQUEST_END);
// Chequea la linea de comandos por se pide ayuda
if (csCommandLineHelper::CheckHelp (object_reg))
{
csCommandLineHelper::Help (object_reg);
return false;
}
//Inicia el sistema principal
error = csInitializer::OpenApplication (object_reg);
// Define el gestor de eventos
error = csInitializer::SetupEventHandler(object_reg, GestorDeEventos);
// Ahora obtenemos punteros a todos los plugins principales
vc = CS_QUERY_REGISTRY (object_reg, iVirtualClock); // El Reloj Virtual
engine = CS_QUERY_REGISTRY (object_reg, iEngine); // El Motor
loader = CS_QUERY_REGISTRY (object_reg, iLoader); // El Parseador de Mapas
g3d = CS_QUERY_REGISTRY (object_reg, iGraphics3D); // El Renderizador 3D
kbd = CS_QUERY_REGISTRY (object_reg, iKeyboardDriver); // El Teclado
return true;
}
[editar] BuclePrincipal
/*-----------------------------* * Función que inicia el bucle principal del programa * ---------------------------*/
bool DelBase::BuclePrincipal()
{
// El loop principal
csDefaultRunLoop (object_reg);
}
[editar] Finaliza
/*-----------------------------* * Función que libera los recursos del programa *---------------------------*/
bool DelBase::Finaliza()
{
// Cuando termina el loop limpiamos la aplicación
csInitializer::DestroyApplication (object_reg);
return true;
}

