Cargando un mapa
De CursosGpl
sexta parte del tutorial
En este capítulo incluimos el código necesario para cargar un mundo completo de CrystalSpace.
Tabla de contenidos |
[editar] Conceptos
[editar] Cargando el mundo
El método para cargar el mundo no difiere mucho del ejemplo anterior. Usamos el cargador de objetos de nuevo.
loader->LoadMapFile ("world")
Tras lo cual el mundo entero se habrá cargado en el motor y ya solo nos queda situar la cámara en uno de los sectores de este.
Es conveniente decir al engine que prepare todos los datos tras cargar todos los archivos que necesitemos.
engine->Prepare()
[editar] Situando la cámara
Al haber cargado el mapa de un archivo no podemos saber en qué posición debemos mostrar la cámara, o por lo menos no podemos asumir una posición en concreto.
En principio el mapa debe contener alguna posición de inicio válida, que podemos obtener usando el motor:
engine->GetCameraPositions ()
Si no tenemos ninguna podemos intentar situar la cámara de alguna otra manera, este ejemplo intenta situarse en un sector llamado "room" en la posición (0,0,0) si no encuentra posiciones de inicio en el mapa.
[editar] Programación
[editar] Cargando el mundo
bool DelBase::CargaMundo() {
// Vamos al directorio del vfs
csRef<iVFS> VFS (CS_QUERY_REGISTRY (object_reg, iVFS));
VFS->ChDir ("/lev/flarge");
// Cargamos el fichero llamado world
if (!loader->LoadMapFile ("world"))
{
csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,
"crystalspace.application.simple",
"No se ha podido cargar el nivel!");
return false;
}
engine->Prepare ();
}
[editar] Situando la cámara
bool DelBase::SituaCamara() {
// Vamos a intentar encontrar posiciones iniciales
csVector3 pos (0, 0, 0);
if (engine->GetCameraPositions ()->GetCount () > 0)
{
// Hay una posición inicial y la cargamos.
iCameraPosition* campos = engine->GetCameraPositions ()->Get (0);
room = engine->GetSectors ()->FindByName (campos->GetSector ());
pos = campos->GetPosition ();
}
else
{
// No se ha encontrado una posición de inicio vamos
// al sector llamado "room" a la posición (0,0,0).
room = engine->GetSectors ()->FindByName ("room");
}
if (!room)
{
csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,
"crystalspace.application.simple",
"No se ha encontrado una posición de inicio válida!");
return false;
}
// Guardamos el resultado de la búsqueda
view->GetCamera ()->SetSector (room);
view->GetCamera ()->GetTransform ().SetOrigin (pos);
return true;
}

