DirectX の初期化には DirectXManager クラスを使用します。
まず、WinAPI を使ってウィンドゥを開きます。
そうして得られたウィンドゥハンドルを
コンストラクタの引数にして DirectXManager オブジェクトを生成します。
Direct3D を使う場合は引数に
スクリーンサイズ、フルスクリーンか否かを
指定して init3D 関数を呼びます。
DirectXManager* dxManager; これで、DirectX の初期化は完了です。 |
IDirect3DDevice7* device; device=dxManager->get3DDevice(); として device (描画するオブジェクト) を取ります。 これは IDirect3DDevice7 オブジェクトですので以降は通常の Direct3D プログラミングと同様です。 一般的には次のような感じになります。
device->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0,1.0,0); |
画像 (IDirectDrawSurface7*) は new ImageLoader()->load(ファイル名); テクスチャー (IDirectDrawSurface7*) は new TextureLoader()->load(ファイル名); で読み込みます。 どちらも使い終わった後に
image->Release(); で解放するのを忘れずに。 |
行列は TransformMatrix クラス、ベクトルは Vector3 クラスなどを使います。
それぞれ getMatrix(), getVector() 関数で
Direct3D の型の値が得られます。
IDirect3DDevice7 オブジェクトのメンバ関数の引数に使用します。
TransformMatrix* matrix; この二つは ObjectPool によって new,delete を演算子を高速化するように特別に扱っているため、 メインループで多数使っても処理速度はさほど落ちませんので 安心して使えます。 |
読みこまれた XFile を表現する XFileObject クラスがあります。
XfileObject* xfile; で読み込みます。 表示をするには xfile->paint(device); とします。 表示位置はワールド行列の設定で変更します。 例えば、
TransformMatrix* world=new TransformMatrix(); このようにします。 |
ソケット間通信の初期化は以下のような手順です。
WinSockManager::initWinSock();// WinSockの初期化 以上のコードでソケットの接続を確立した後は、 出力は例えば以下のように行います。
byte *data=new byte[256]; 入力は例えば以下のように行います。
byte *data=new byte[256]; |
まずDirectSound の初期化を以下のように行います。
DirectSoundManager *directSoundManager=new DirectSoundManager(); 次にWave ファイルの読み込みます。
SoundData *soundData; SoundDataの初期化をします。 directSoundManager->getDirectSoundBuffer(soundData); ついに再生です。 SoundPlayer::play(soundData,false);//play(SoundData*,音のループ再生の可否) |
Serialization の使い方は Java と少しだけ異なります。
極力 Java に似せようとしましたが、様々な理由から現在の実装となっています。
より良い実装方法がありましたら、教え下さい。 Serialization されるクラスは Serializable クラス (Java のインターフェースに相当) を継承してください。そして、
virtual void readObject(ObjectInputStream* in)=0; の 2 つのメソッドを実装します。 実装方法はほぼ Java と同じです。 例えば、フィールド値として Vector3 オブジェクトを持っている SerializationTest クラスで その Vector3 オブジェクトを Serialization したいとき、 readObject メソッドは
float x,y,z; のように、writeObject メソッドは
out->writeFloat(position->getX()); のようにします。 そして、この SerializationTest クラスのインスタンス object を Serialization してファイルに保存するには
ObjectOutputStream* out=new ObjectOutputStream( ファイルから読みこむには
ObjectInputStream* in=new ObjectInputStream( とします。 ObjectOutputStream#writeObject がグローバル関数の writeObject 関数、 ObjectInputStream#readObject がグローバル関数の readObject 関数として 用意されている点に注意してください。 テンプレート関数になっていますが、そのテンプレートクラスとして Serialization 対象となるクラスまたはその親クラスを指定してください。 そのテンプレートの対象となったクラスには
static SerializationTest* newInstance(int id); のような 2 つのメソッドを定義します。 これはこの「たけのこ」特有のもので、 C++ では reflection 機能がないためにこのような方法を取っています。 getTypeID メソッドはクラスに固有の ID を返すようにして下さい。 その ID を newInstance の引数に渡すとそのクラスのインスタンスを生成して 返すようにして下さい。 例えば、この例では Serialization 対象となるクラスは SerializationTest クラス 1 つですので、
int SerializationTest::getTypeID(void) とします。 |
デバッグ用に文字列を出力させることができます。
出力先は開発環境に依存します (Visual C++ ではアウトプットウィンドゥ)。
文字列出力には lib.lang.Dubugger クラスのクラスメソッドを使用します。
通常文字列を出力させるには Dubugger->println(文字列); とします。println メソッドの引数には任意の方の指定ができます。 また、DirectX オブジェクトの各種帰り値を文字列化して出力するには Dubugger->printErrorDDraw(メソッドの帰り値); とします。この例では DirectDraw の場合ですが、 他の DirectX についても
static void printErrorD3D(HRESULT value); と、それぞれにメソッドが用意されています。 |