4.2.3.1 最小の基礎コード


4.2.3.1 最小の基礎コード

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':

はじめに、チュートリアル1のコードを持ってきて、形状を作成する部分のコードを除去し、カメラのデフォルト位置を初期化します。さらに、新しいLoadMap?()機能を追加します。結果、`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<iCollideSystem> cdsys;
 csRef<iView> view;
 iSector* room;
 csColliderActor collider_actor;

 bool OnKeyboard (iEvent&);
 void ProcessFrame ();
 void FinishFrame ();
 bool LoadMap ();

public:
 Simple ();
 ~Simple ();

 void OnExit ();
 bool OnInitialize (int argc, char* argv[]);
 bool Application ();

 CS_EVENTHANDLER_NAMES("application.simpmap")
 CS_EVENTHANDLER_NIL_CONSTRAINTS
};

#endif // __SIMPMAP_H__

Similarly, for `simpmap.cpp':

同様に、`simpmap.cpp`は次のようです。

#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(cscmdQuit);
   }
 }
 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);
}

One important note in the code above which differs from the earlier tutorials is that we removed the following line:

最も簡単なチュートリアルからの変更点の中で、上記コード内で重要な1つの注意点は、次の1ラインを取り除くことです。

engine->SetLightingCacheMode (0);

This is 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.

これは、マップファイルから読み込もうとした際、もし存在していた場合、キャッシュからライティング情報を読み込もうとするためです。マップの再ライトニングは、時間消費の大きな過程であるために、このような動作をします。

最新の20件

2007-02-18 2007-02-12 2007-01-31 2007-02-12 2007-01-14 2007-01-21 2007-02-12 2007-02-11 2007-01-15 2007-01-14 2007-02-12 2007-02-11 2007-02-01 2007-01-21 2007-01-19 2007-02-12
  • 4.2.3.1 最小の基礎コード
2007-01-19 2009-08-27 2007-01-10

今日の5件

  • counter: 79
  • today: 1
  • yesterday: 0
  • online: 1