| #include "simpmap.h"
CS_IMPLEMENT_APPLICATION
Simple::Simple ()
{
SetApplicationName ("CrystalSpace.SimpleMap");
}
Simple::~Simple ()
{
}
void Simple::ProcessFrame ()
{
// First get elapsed time from the virtual clock.
csTicks elapsed_time = vc->GetElapsedTicks ();
csVector3 obj_move (0);
csVector3 obj_rotate (0);
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))
obj_move = CS_VEC_RIGHT * 3.0f;
if (kbd->GetKeyState (CSKEY_LEFT))
obj_move = CS_VEC_LEFT * 3.0f;
if (kbd->GetKeyState (CSKEY_UP))
obj_move = CS_VEC_UP * 3.0f;
if (kbd->GetKeyState (CSKEY_DOWN))
obj_move = CS_VEC_DOWN * 3.0f;
}
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 (more on this in a second) and up and down
// arrows cause the camera to go forwards and backwards.
if (kbd->GetKeyState (CSKEY_RIGHT))
obj_rotate.Set (0, 1, 0);
if (kbd->GetKeyState (CSKEY_LEFT))
obj_rotate.Set (0, -1, 0);
if (kbd->GetKeyState (CSKEY_PGUP))
obj_rotate.Set (1, 0, 0);
if (kbd->GetKeyState (CSKEY_PGDN))
obj_rotate.Set (-1, 0, 0);
if (kbd->GetKeyState (CSKEY_UP))
obj_move = CS_VEC_FORWARD * 3.0f;
if (kbd->GetKeyState (CSKEY_DOWN))
obj_move = CS_VEC_BACKWARD * 3.0f;
}
collider_actor.Move (float (elapsed_time) / 1000.0f, 1.0f,
obj_move, obj_rotate);
// 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 =
csQueryRegistry<iEventQueue> (GetObjectRegistry());
if (q.IsValid())
q->GetEventOutlet()->Broadcast(csevQuit (GetObjectRegistry ()));
}
}
return false;
}
bool Simple::OnInitialize(int argc, char* argv[])
{
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_PLUGIN("crystalspace.collisiondetection.opcode",
iCollideSystem),
CS_REQUEST_END))
return ReportError("Failed to initialize plugins!");
csBaseEventHandler::Initialize(GetObjectRegistry());
if (!RegisterQueue(GetObjectRegistry(), csevAllEvents(GetObjectRegistry())))
return ReportError("Failed to set up event handler!");
return true;
}
void Simple::OnExit()
{
}
bool Simple::Application()
{
if (!OpenApplication(GetObjectRegistry()))
return ReportError("Error opening system!");
g3d = csQueryRegistry<iGraphics3D> (GetObjectRegistry());
if (!g3d) return ReportError("Failed to locate 3D renderer!");
engine = csQueryRegistry<iEngine> (GetObjectRegistry());
if (!engine) return ReportError("Failed to locate 3D engine!");
vc = csQueryRegistry<iVirtualClock> (GetObjectRegistry());
if (!vc) return ReportError("Failed to locate Virtual Clock!");
kbd = csQueryRegistry<iKeyboardDriver> (GetObjectRegistry());
if (!kbd) return ReportError("Failed to locate Keyboard Driver!");
loader = csQueryRegistry<iLoader> (GetObjectRegistry());
if (!loader) return ReportError("Failed to locate Loader!");
cdsys = csQueryRegistry<iCollideSystem> (GetObjectRegistry());
if (!cdsys) return ReportError ("Failed to locate CD system!");
view.AttachNew(new csView (engine, g3d));
iGraphics2D* g2d = g3d->GetDriver2D ();
// We use the full window to draw the world.
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);
}
|