« PInvokeとポインタの落とし穴 | メイン | 構造体を格納するプロパティ »

2006年04月17日

C# のための DirectX ライブラリ [C#]

DxLibrary for .NET ver 0.81[1.03MByte]

DXライブラリの C# ラッパクラスがとりあえずできました。このライブラリを使うと、一部の関数を除き、ほとんどのDXライブラリの関数が C# から利用できます。DirextX SDK を使うより、簡単にDirectXを使ったゲーム等のプログラムをすることができます。

まだ試作段階なので、かなりのバグが残されている可能性があります。ご了承ください。もしバグ等を見つけましたらご連絡いただければ助けになります。

これからの展開としては、Windowsフォームのコントロールのようなクラスを用意して、より抽象的にオブジェクトにアクセスできるようにしたいと考えております。

DXライブラリからの主な変更点を、以下に記しておきます。

名前空間

DxLibrary クラス、及び新たに作成した構造体や列挙型は全て Mjrk.Net.DirectX 名前空間に所属しています。これらのクラス群を利用する場合は、usingディレクティブを使って簡単に名前空間にアクセスできるようにすると便利です。

構造化エラー処理の採用

関数内で何らかのエラーが発生したとき、-1 を返すのではなく独自の例外クラス DxLibException(System.ApplicationExceptionを継承) を投げるようにしました。このため、多くのメソッドの返り値が void 型に変更されています。

各種ハンドルのデータ型(Mjrk.Net.DirectX.ImageId 型)等

LoadGraph 等で読み込まれたグラフィックハンドルは単なる int 型でしたが、ImageId 型という独自の値型を返すようにしました。内部的には int型 を用いていますが、明確に区別しエラーを少なくするために採用しました。int型からImageIdを作成するには、new ImageId(int id);。ImageIdからintに変換するには、ToInt(); メソッドを使用します。

同じように、フォントハンドル()、サウンドハンドル、キー入力ハンドル、マスクハンドルも全て独自のデータ型を用意しています。

ハンドル型からのメソッド呼び出し

ImageId や FontId などのハンドル型では、それらを引数として使用する関数をメソッド呼び出しすることができます。例えば ImageId の Draw メソッドでは、拡大表示や回転表示など様々な描画系関数をオーバーライドで呼び出すことができます。

フラグをbool型に

TRUEとFALSE で表される単純なフラグ引数に関しては、全て int 型ではなく bool 型で呼び出すようにしました。

定数を列挙型に

DXライブラリで使う定数は、全て列挙型で再定義しています。例えばエッジ付きフォントを表す DX_FONTTYPE_EDGE は、DxFontType.Edge として指定します。列挙型の値を数値に戻したい場合は、int型(もしくはuint型)でキャストすることができます。

文字列型

文字列型は char 配列のポインタ型でしたが、string 型を使用します。

参照型引数を返り値に

LoadDivGraph や GetGraphSize、GetJoyPadAnalogInput などでは int型変数のポインタを引数として渡していますが、これらの値は返り値として返すようにしました。そのため引数のリストからは取り除かれています。

互換モードと標準モード

いくつかのメソッドは互換モードと標準モードの2種類のオーバーロードされたメソッドがあります。これは .NET の System.Drawing にあるいくつかのデータ型を採用するか(標準モード)、従来どおり int型で呼び出すか(互換モード)の違いとなっています。内部的には同じことを行っているので、使いやすいほうを用いて構いません。が、メソッド呼び出しではSystem.Drawing名前空間のほうしか用意していないため、こちらのほうをおすすめします。

座標やサイズのデータ型

座標値は二つの int 型の対ではなく、System.Drawing.Point 構造体を使用するようにしました。同じく、画像等のサイズも System.Drawing.Size 構造体を使用します。また、Point と Size セットになったいる場合は、System.Drawing.Rectangle 構造体も使用できます。が但しこの方式は賛否両論があると思うので、従来どおり int 型二つの引数のものもオーバーロードしたメソッドとして用意しています(互換モード)。

色のデータ型

色はカラーコードとして int 型を用いていましたが、標準モードでは System.Drawing.Color 構造体を使用します。RGB値から 任意のColor型を作成するには、Color.FromArgb(int,int,int)メソッドを用いると良いでしょう。互換モードのメソッドでは、従来どおり GetColor(int,int,int) メソッドで得られる int 型のカラーコードを用います。

右下座標 -1 を Size 型に

DrawBox などのいくつかのメソッドでは、描画する右下の座標-1を指定していました。これを標準モードでは全て System.Drawing.Size 構造体による、サイズ表現に変更しています(このほうが直感的で便利なので)。座標ではなくサイズですから、( 右下の座標 - 左上の座標 )を計算したものになります。さらに Rectangle 型の場合は、サイズと右下の座標の双方で指定できます(ただし-1されない本当の座標です)。ここだけは、単なるデータ型変更だけでは対応できないので注意してください。(※互換モードでは従来どおり右下の座標-1です!間違ってサイズを指定しないようにしてください)

引数の大文字小文字

引数の変数名を .NET の命名規則に従い、全て Camel 形式に統一しました。

実装しなかった関数

以下の関数は実装していません。 EnumFontName (System.Drawing.InstalledFontCollection.Familiesで代用可能)、ファイル関連(System.IO.で代用可能)、Format 関連(実装が困難。文字列連結で代用可能)、ネットワーク関連(今すぐ必要ではなかったので)、GetAllKeyState(どうにもうまく拾えません)。もちろん、これらも今後実装していく可能性は充分あります。

投稿者 : 17:34 | コメント (1) | トラックバック (0)

トラックバック

このエントリーのトラックバックURL:
http://totora.jpn.org/mt/mt-tb.cgi/125

コメント

ЎUf, me gustу! Tan clara y positiva.

Worker

投稿者 Worker : 2010年10月25日 06:37

コメントしてください




保存しますか?

(書式を変更するような一部のHTMLタグを使うことができます)