[ < ] | [ > ] | [ << ] | [ 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.