#include #include #include #include #include #include #include #include #include #include "app.h" #include "behave.h" MainApp::MainApp () { SetApplicationName ("Seminar Test"); } MainApp::~MainApp () { } bool MainApp::LoadLevel () { level_entity = pl->CreateEntity ("level", bl, "level_behave", "pczonemanager", CEL_PROPCLASS_END); if (!level_entity) return ReportError ("Error creating level entity!"); // Now get the iPcZoneManager interface so we can setup the level. csRef zonemgr = CEL_QUERY_PROPCLASS_ENT (level_entity, iPcZoneManager); iCelZone* zone = zonemgr->CreateZone ("main"); iCelRegion* region = zonemgr->CreateRegion ("main"); zone->LinkRegion (region); iCelMapFile* mapfile = region->CreateMapFile (); mapfile->SetPath ("/cellib/lev"); mapfile->SetFile ("walktut_world"); iCelMapFile* entitiesfile = region->CreateMapFile (); entitiesfile->SetPath ("/cellib/lev"); entitiesfile->SetFile ("walktut_entities"); return true; } bool MainApp::CreatePlayer () { player_entity = pl->CreateEntity ("player", bl, "player_behave", "pcdefaultcamera", "pcmesh", "pclinearmovement", "pcactormove", "pccommandinput", "pcinventory", CEL_PROPCLASS_END); if (!player_entity) return ReportError ("Error creating player entity!"); // Get the iPcCamera interface so that we can set the camera. csRef pccamera = CEL_QUERY_PROPCLASS_ENT (player_entity, iPcCamera); // Get the zone manager from the level entity which should have been created // by now. csRef pczonemgr = CEL_QUERY_PROPCLASS_ENT (level_entity, iPcZoneManager); pccamera->SetZoneManager (pczonemgr, true, "main", "Camera"); // Get the iPcMesh interface so we can load the right mesh // for our player. csRef pcmesh = CEL_QUERY_PROPCLASS_ENT (player_entity, iPcMesh); pcmesh->SetPath ("/cel/data"); pcmesh->SetMesh ("test", "cally.cal3d"); if (!pcmesh->GetMesh ()) return ReportError ("Error loading model!"); if (pczonemgr->PointMesh ("player", "main", "Camera")) return ReportError ("Can't find region or start position in region!"); // Get iPcLinearMovement so we can setup the movement system. csRef pclinmove = CEL_QUERY_PROPCLASS_ENT (player_entity, iPcLinearMovement); pclinmove->InitCD ( csVector3 (0.5f,0.8f,0.5f), csVector3 (0.5f,0.4f,0.5f), csVector3 (0,0,0)); // Get the iPcActorMove interface so that we can set movement speed. csRef pcactormove = CEL_QUERY_PROPCLASS_ENT (player_entity, iPcActorMove); pcactormove->SetMovementSpeed (3.0f); pcactormove->SetRunningSpeed (5.0f); pcactormove->SetRotationSpeed (1.75f); // Get iPcCommandInput so we can do key bindings. The behaviour layer // will interprete the commands so the actor can move. csRef pcinput = CEL_QUERY_PROPCLASS_ENT (player_entity, iPcCommandInput); // We read the key bindings from the standard config file. pcinput->Bind ("up", "forward"); pcinput->Bind ("down", "backward"); pcinput->Bind ("left", "rotateleft"); pcinput->Bind ("right", "rotateright"); pcinput->Bind ("m", "cammode"); pcinput->Bind ("d", "drop"); return true; } void MainApp::ProcessFrame () { } void MainApp::FinishFrame () { // Just tell the 3D renderer that everything has been rendered. g3d->FinishDraw (); g3d->Print (0); } bool MainApp::OnKeyboard(iEvent& ev) { // We got a keyboard event. csKeyEventType eventtype = csKeyEventHelper::GetEventType(&ev); if (eventtype == csKeyEventTypeDown) { // The user pressed a key (as opposed to releasing it). utf32_char code = csKeyEventHelper::GetCookedCode(&ev); if (code == CSKEY_ESC) { // The user pressed escape to exit the application. // The proper way to quit a Crystal Space application // is by broadcasting a cscmdQuit event. That will cause the // main runloop to stop. To do that we get the event queue from // the object registry and then post the event. csRef q = CS_QUERY_REGISTRY(GetObjectRegistry(), iEventQueue); if (q.IsValid()) q->GetEventOutlet()->Broadcast( csevQuit (GetObjectRegistry ())); } } return false; } bool MainApp::OnInitialize (int argc, char* argv[]) { if (!celInitializer::RequestPlugins (object_reg, 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 ("cel.physicallayer", iCelPlLayer), CS_REQUEST_PLUGIN ("crystalspace.collisiondetection.opcode", iCollideSystem), CS_REQUEST_END)) return ReportError ("Can't initialize plugins!"); csBaseEventHandler::Initialize(object_reg); if (!RegisterQueue(object_reg, csevAllEvents(object_reg))) return ReportError ("Can't setup event handler!"); return true; } bool MainApp::Application () { if (!OpenApplication (object_reg)) return ReportError ("Error opening system!"); g3d = CS_QUERY_REGISTRY (object_reg, iGraphics3D); engine = CS_QUERY_REGISTRY (object_reg, iEngine); loader = CS_QUERY_REGISTRY (object_reg, iLoader); vfs = CS_QUERY_REGISTRY (object_reg, iVFS); vc = CS_QUERY_REGISTRY (object_reg, iVirtualClock); kbd = CS_QUERY_REGISTRY (object_reg, iKeyboardDriver); pl = CS_QUERY_REGISTRY (object_reg, iCelPlLayer); bl.AttachNew (new BehaviourLayer(pl)); // We also need to register it to the object registry. if (!object_reg->Register (bl, "iCelBlLayer")) return ReportError ("Can't register our behaviour layer!"); // Make sure the application dir is mounted at /cel vfs->Mount ("cel", "$.$/"); pl->RegisterBehaviourLayer (bl); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.zonemanager")) return ReportError ("Error loading pczonemanager factory!"); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.solid")) return ReportError ("Error loading pcsolid factory!"); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.colldet")) return ReportError ("Error loading pccolldet factory!"); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.defaultcamera")) return ReportError ("Error loading pcdefaultcamera factory!"); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.mesh")) return ReportError ("Error loading pcmesh factory!"); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.meshselect")) return ReportError ("Error loading pcmeshselect factory!"); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.linmove")) return ReportError ("Error loading pclinmove factory!"); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.pccommandinput")) return ReportError ("Error loading pccommandinput factory!"); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.actormove")) return ReportError ("Error loading pcactormove factory!"); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.inventory")) return ReportError ("Error loading pcinventory factory!"); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.properties")) return ReportError ("Error loading pcproperties factory!"); if (!pl->LoadPropertyClassFactory ("cel.pcfactory.timer")) return ReportError ("Error loading pctimer factory!"); if (!LoadLevel ()) return ReportError ("Error loading level!"); if (!CreatePlayer ()) return ReportError ("Couldn't create player!"); Run (); return true; }