オンラインマニュアル


目的別使用法

DirectX の使い方

    DirectX の初期化には DirectXManager クラスを使用します。 まず、WinAPI を使ってウィンドゥを開きます。 そうして得られたウィンドゥハンドルを コンストラクタの引数にして DirectXManager オブジェクトを生成します。 Direct3D を使う場合は引数に スクリーンサイズ、フルスクリーンか否かを 指定して init3D 関数を呼びます。

 DirectXManager* dxManager;
 dxManager=new DirectXManager(handle);
 dxManager->init3D(width,height,fullscreen);

これで、DirectX の初期化は完了です。

   

Direct3D の使い方

     IDirect3DDevice7* device;
 device=dxManager->get3DDevice();

として device (描画するオブジェクト) を取ります。 これは IDirect3DDevice7 オブジェクトですので以降は通常の Direct3D プログラミングと同様です。 一般的には次のような感じになります。

 device->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0,1.0,0);
 // 画面消去
 device->BeginScene();
 // 3D 処理開始
 device->SetRenderState(ステート,値);
 // レンダリング方法の変更
 device->SetTransform(D3DTRANSFORMSTATE_WORLD,同次行列);
 // 変換行列 (座標、回転) の変更
 device->SetMaterial(マテリアル構造体);
 // マテリアルの変更
 device->SetTexture(0,texture);
 // テクスチャの変更
 device->SetTextureStageState(0,D3DTSS_COLOROP,混ぜ方);
 // テクスチャの混ぜ方の変更
 device->DrawPrimitive(D3DPT_TRIANGLESTRIP,D3DFVF_VERTEX,
                座標リストへのポインタ,頂点数,NULL);
 // ポリゴン描画
 device->EndScene();
 // 3D 処理終了

   

画像・テクスチャー読み込み

    画像 (IDirectDrawSurface7*) は

 new ImageLoader()->load(ファイル名);

テクスチャー (IDirectDrawSurface7*) は

 new TextureLoader()->load(ファイル名);

で読み込みます。 どちらも使い終わった後に

 image->Release();
 texture->Release();

で解放するのを忘れずに。

   

行列・ベクトルクラス

    行列は TransformMatrix クラス、ベクトルは Vector3 クラスなどを使います。 それぞれ getMatrix(), getVector() 関数で Direct3D の型の値が得られます。 IDirect3DDevice7 オブジェクトのメンバ関数の引数に使用します。

 TransformMatrix* matrix;
 matrix=new TransformMatrix();
 device->SetTransform(D3DTRANSFORMSTATE_WORLD,matrix->getMatrix());

この二つは ObjectPool によって new,delete を演算子を高速化するように特別に扱っているため、 メインループで多数使っても処理速度はさほど落ちませんので 安心して使えます。

   

XFile 読み込み

    読みこまれた XFile を表現する XFileObject クラスがあります。

 XfileObject* xfile;
 xfile=new XFileLoader()->load(ファイル名);

で読み込みます。 表示をするには

 xfile->paint(device);

とします。 表示位置はワールド行列の設定で変更します。 例えば、

 TransformMatrix* world=new TransformMatrix();
 world->setTranslation(0.0f,0.0f,2.0f);
 device->SetTransform(D3DTRANSFORMSTATE_WORLD,&(world->getMatrix()));

このようにします。

   

ネットワーク:TCP編

    ソケット間通信の初期化は以下のような手順です。

 WinSockManager::initWinSock();// WinSockの初期化
 Socket *socket=NULL;
 OutputStream *out=NULL;
 InputStream *in=NULL;  try{
  socket=new Socket(
   InetAddress::getHostByName("localhost") //アドレス
   ,12345 //ポート番号
  );
  
  socket->makeConnection();//接続要求
  while(true){
   if(socket->isConnected()){//接続の確立をチェック
    out=socket->getOutputStream();//出力ストリームの初期化
    in=socket->getInputStream();//入力ストリームの初期化
    break;
   }
  }
  
 }catch(IOException *ie){
  Debugger::println(ie->getMessage());
 }

以上のコードでソケットの接続を確立した後は、 出力は例えば以下のように行います。

 byte *data=new byte[256];
 for(int i=0;i<256;i++){
  data[i]=(byte)i;
 }
 out->write(data,0,256);//out->write(char *,int offset,int length)
 out->flush();

入力は例えば以下のように行います。

 byte *data=new byte[256];
 int readLength=0;
 while(true){//256byte 読み終えたら抜ける
  readLength+=in->read(data,readLength,256-readLength);
  if(readLength==256)break;
 }

   

DirectSound

    まずDirectSound の初期化を以下のように行います。

 DirectSoundManager *directSoundManager=new DirectSoundManager();
 directSoundManager->initDirectSound(window->getHandle());
 //window ハンドルを渡して初期化

次にWave ファイルの読み込みます。

 SoundData *soundData;
 soundData=WaveFileLoader::readWaveFile(new String("test.wav"));
 //test.wav を読み込みます

SoundDataの初期化をします。

 directSoundManager->getDirectSoundBuffer(soundData);

ついに再生です。

 SoundPlayer::play(soundData,false);//play(SoundData*,音のループ再生の可否)

   

Serialization

    Serialization の使い方は Java と少しだけ異なります。 極力 Java に似せようとしましたが、様々な理由から現在の実装となっています。 より良い実装方法がありましたら、教え下さい。

Serialization されるクラスは Serializable クラス (Java のインターフェースに相当) を継承してください。そして、

 virtual void readObject(ObjectInputStream* in)=0;
 virtual void writeObject(ObjectOutputStream* out)=0;

の 2 つのメソッドを実装します。 実装方法はほぼ Java と同じです。 例えば、フィールド値として Vector3 オブジェクトを持っている SerializationTest クラスで その Vector3 オブジェクトを Serialization したいとき、 readObject メソッドは

 float x,y,z;
 x=in->readFloat();
 y=in->readFloat();
 z=in->readFloat();
 position=new Vector3(x,y,z);

のように、writeObject メソッドは

 out->writeFloat(position->getX());
 out->writeFloat(position->getY());
 out->writeFloat(position->getZ());

のようにします。 そして、この SerializationTest クラスのインスタンス object を Serialization してファイルに保存するには

 ObjectOutputStream* out=new ObjectOutputStream(
          new FileOutputStream("test.serialization"));
 ::writeObject < SerializationTest > (out,object);
 out->close();
 delete out;

ファイルから読みこむには

 ObjectInputStream* in=new ObjectInputStream(
          new FileInputStream("test.serialization"));
 object=::readObject < SerializationTest > (in);
 in->close();
 delete in;

とします。 ObjectOutputStream#writeObject がグローバル関数の writeObject 関数、 ObjectInputStream#readObject がグローバル関数の readObject 関数として 用意されている点に注意してください。 テンプレート関数になっていますが、そのテンプレートクラスとして Serialization 対象となるクラスまたはその親クラスを指定してください。 そのテンプレートの対象となったクラスには

 static SerializationTest* newInstance(int id);
 virtual int getTypeID(void);

のような 2 つのメソッドを定義します。 これはこの「たけのこ」特有のもので、 C++ では reflection 機能がないためにこのような方法を取っています。 getTypeID メソッドはクラスに固有の ID を返すようにして下さい。 その ID を newInstance の引数に渡すとそのクラスのインスタンスを生成して 返すようにして下さい。 例えば、この例では Serialization 対象となるクラスは SerializationTest クラス 1 つですので、

 int SerializationTest::getTypeID(void)
 {
  if (this->instanceof(SerializationTest))
  {
   return 0;
  }
  else
  {
   return -1;
  }
 }
 
 SerializationTest* SerializationTest::newInstance(int id)
 {
  switch (id)
  {
   case 0:     return new SerializationTest();
   default:     return NULL;
  }
 }

とします。

   

デバッグ

    デバッグ用に文字列を出力させることができます。 出力先は開発環境に依存します (Visual C++ ではアウトプットウィンドゥ)。 文字列出力には lib.lang.Dubugger クラスのクラスメソッドを使用します。 通常文字列を出力させるには

 Dubugger->println(文字列);

とします。println メソッドの引数には任意の方の指定ができます。 また、DirectX オブジェクトの各種帰り値を文字列化して出力するには

 Dubugger->printErrorDDraw(メソッドの帰り値);

とします。この例では DirectDraw の場合ですが、 他の DirectX についても

 static void printErrorD3D(HRESULT value);
 static void printErrorDInput(HRESULT value);
 static void printErrorDSound(HRESULT value);
 static void printErrorDMusic(HRESULT value);
 static void printErrorDXFile(HRESULT value);

と、それぞれにメソッドが用意されています。