Cargando un mapa

De CursosGpl

cargando un mapa
cargando un mapa

sexta parte del tutorial

En este capítulo incluimos el código necesario para cargar un mundo completo de CrystalSpace.

código c++

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;

}

Herramientas personales