| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To start, we first take the code of tutorial one
and remove the code that creates geometry and initializes
the default camera position. In addition we add a new LoadMap()
function. This results in the following for `simpmap.h':
#ifndef __SIMPMAP_H__
#define __SIMPMAP_H__
#include <crystalspace.h>
class Simple
: public csApplicationFramework, public csBaseEventHandler
{
private:
csRef<iEngine> engine;
csRef<iLoader> loader;
csRef<iGraphics3D> g3d;
csRef<iKeyboardDriver> kbd;
csRef<iVirtualClock> vc;
csRef<iView> view;
iSector* room;
csVector3 pos;
float rotX, rotY;
bool OnKeyboard (iEvent&);
void ProcessFrame ();
void FinishFrame ();
bool LoadMap ();
public:
Simple (iObjectRegistry* object_reg);
~Simple ();
void OnExit ();
bool OnInitialize (int argc, char* argv[]);
bool Application ();
};
#endif // __SIMPMAP_H__
|
Similarly, for `simpmap.cpp':
#include "simpmap.h"
CS_IMPLEMENT_APPLICATION
Simple::Simple (iObjectRegistry* object_reg)
{
SetApplicationName ("CrystalSpace.SimpleMap");
}
Simple::~Simple ()
{
}
void Simple::ProcessFrame ()
{
// First get elapsed time from the virtual clock.
csTicks elapsed_time = vc->GetElapsedTicks ();
// Now rotate the camera according to keyboard state
float speed = (elapsed_time / 1000.0) * (0.03 * 20);
iCamera* c = view->GetCamera();
if (kbd->GetKeyState (CSKEY_SHIFT))
{
// If the user is holding down shift, the arrow keys will cause
// the camera to strafe up, down, left or right from it's
// current position.
if (kbd->GetKeyState (CSKEY_RIGHT))
c->Move (CS_VEC_RIGHT * 4 * speed);
if (kbd->GetKeyState (CSKEY_LEFT))
c->Move (CS_VEC_LEFT * 4 * speed);
if (kbd->GetKeyState (CSKEY_UP))
c->Move (CS_VEC_UP * 4 * speed);
if (kbd->GetKeyState (CSKEY_DOWN))
c->Move (CS_VEC_DOWN * 4 * speed);
}
else
{
// left and right cause the camera to rotate on the global Y
// axis; page up and page down cause the camera to rotate on the
// _camera's_ X axis and up and downarrows cause the camera to
// go forwards and backwards.
if (kbd->GetKeyState (CSKEY_RIGHT))
rotY += speed;
if (kbd->GetKeyState (CSKEY_LEFT))
rotY -= speed;
if (kbd->GetKeyState (CSKEY_PGUP))
rotX += speed;
if (kbd->GetKeyState (CSKEY_PGDN))
rotX -= speed;
if (kbd->GetKeyState (CSKEY_UP))
c->Move (CS_VEC_FORWARD * 4 * speed);
if (kbd->GetKeyState (CSKEY_DOWN))
c->Move (CS_VEC_BACKWARD * 4 * speed);
}
// We now assign a new rotation transformation to the camera.
csMatrix3 rot = csXRotMatrix3 (rotX) * csYRotMatrix3 (rotY);
csOrthoTransform ot (rot, c->GetTransform().GetOrigin ());
c->SetTransform (ot);
// Tell 3D driver we're going to display 3D things.
if (!g3d->BeginDraw(
engine->GetBeginDrawFlags() | CSDRAW_3DGRAPHICS))
return;
// Tell the camera to render into the frame buffer.
view->Draw ();
}
void Simple::FinishFrame ()
{
g3d->FinishDraw ();
g3d->Print (0);
}
bool Simple::OnKeyboard(iEvent& ev)
{
csKeyEventType eventtype = csKeyEventHelper::GetEventType(&ev);
if (eventtype == csKeyEventTypeDown)
{
utf32_char code = csKeyEventHelper::GetCookedCode(&ev);
if (code == CSKEY_ESC)
{
csRef<iEventQueue> q =
CS_QUERY_REGISTRY(GetObjectRegistry(), iEventQueue);
if (q.IsValid()) q->GetEventOutlet()->Broadcast(cscmdQuit);
}
}
return false;
}
bool Simple::Initialize ()
{
if (!csInitializer::RequestPlugins(GetObjectRegistry(),
CS_REQUEST_VFS,
CS_REQUEST_OPENGL3D,
CS_REQUEST_ENGINE,
CS_REQUEST_FONTSERVER,
CS_REQUEST_IMAGELOADER,
CS_REQUEST_LEVELLOADER,
CS_REQUEST_REPORTER,
CS_REQUEST_REPORTERLISTENER,
CS_REQUEST_END))
return ReportError("Failed to initialize plugins!");
if (!RegisterQueue(GetObjectRegistry()))
return ReportError("Failed to set up event handler!");
return true;
}
bool Simple::Application()
{
if (!OpenApplication(GetObjectRegistry()))
return ReportError("Error opening system!");
g3d = CS_QUERY_REGISTRY(GetObjectRegistry(), iGraphics3D);
if (!g3d) return ReportError("Failed to locate 3D renderer!");
engine = CS_QUERY_REGISTRY(GetObjectRegistry(), iEngine);
if (!engine) return ReportError("Failed to locate 3D engine!");
vc = CS_QUERY_REGISTRY(GetObjectRegistry(), iVirtualClock);
if (!vc) return ReportError("Failed to locate Virtual Clock!");
kbd = CS_QUERY_REGISTRY(GetObjectRegistry(), iKeyboardDriver);
if (!kbd) return ReportError("Failed to locate Keyboard Driver!");
loader = CS_QUERY_REGISTRY(GetObjectRegistry(), iLoader);
if (!loader) return ReportError("Failed to locate Loader!");
view = csPtr<iView> (new csView (engine, g3d));
iGraphics2D* g2d = g3d->GetDriver2D ();
view->SetRectangle (0, 0, g2d->GetWidth (), g2d->GetHeight ());
Run();
return true;
}
/*---------------*
* Main function
*---------------*/
int main (int argc, char* argv[])
{
return csApplicationRunner<Simple>::Run (argc, argv);
}
|
One important note in the code above: we removed the following line:
engine->SetLightingCacheMode (0); |
That's because, when we are loading from map file, we actually want the lighting information to be read from the cache (if present). We do so because relighting a map can be a time-consuming process.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated using texi2html 1.76.