(1)インストール方法
下記からアーカイブをダウンロードし、適当な場所に展開して下さい。
ファイル名 | 備考 |
Box2DLib20080617.zip | 初公開バージョン |
使用時は展開ファイル中の「Box2DLib.DLL」を参照設定で追加して下さい。
上記アーカイブにはDLLの全ソースが含まれています。(source.zip)
ソースからビルドする場合はBox2Dライブラリが必要になります。
Box2Dライブラリは下記からダウンロードできます。
http://sourceforge.net/project/showfiles.php?group_id=205387
上記からダウンロードできるzipを展開し、
\Build\VC8フォルダにある Box2D.sln をVisual Studio
で開いてビルドしてください。
Libraryフォルダに box2d.lib が作成されます。
(Box2DはVS2005で作成されています。
VS2008でもコンパイル可能ですが、はじめに変換をしなければなりません。
といっても変換は自動的にウィザードが開きますので、
そのまま進めれば簡単にVS2008用に変換してくれます。)
次にフォルダツリー中のフォルダContrib下に
当方のBox2DLibのソース「source.zip」を展開して下さい。
(Contribフォルダ下にフォルダ付で展開して下さい)
後はVC2008でBox2DLib.slnを開いてビルドを行えば
「Box2DLib.DLL」を作成することができます。
(binフォルダ下に作成されます。)
また「source.zip」にはサンプルプログラムのVBソースも含まれてます。
(sampleフォルダ下にあります)
(2)コンポーネントについて
○基本構造
この.NETコンポーネントは元々C++/CLIの勉強のために作り始めたのですが、
途中からBox2Dを動かすことが目的に変わってきてしまい、どうせなら公開してみようとなったものです。
Box2Dを.Net Frameworkに移植したのではなく、
Box2Dのライブラリを.Net Frameworkで使うための橋渡し的なコンポーネントになってます。
(こっちの方がパフォーマンスが出て楽かなぁって思ったのですが、
検証もやっとりませんのでなんとも言えません)
また全てのクラスは Box2DObject というクラスを継承していますが、 あまり意味はありません(^^;。
ネイティブなオブジェクトの確保/解放を
楽にチェックできるようにしようとか、
オブジェクトを引数にした時に自由度を持たせようとか
を思ってやったのですが、
ほとんど構想だけで終わってます。
○マクロ
ソースを見てみるとわかると思いますが、
基本的にネイティブなクラス(構造体)をラップする
マネージクラスをマクロで定義しているだけです。
(はじめは、よーしtemplateやgenericを使いまくっちゃうぞって
思ってたのですが、、、、、私には無理でした^^;;)
ほとんどマクロの羅列なんで、
そのままでは本来のコードがわかりにくいと思います。
コンパイルオプションに「/P」を追加してビルドすると、
マクロが展開されたコードが「main.i」に出力されるので
それを見てもらうと何をやってるのかがわかるかと思います。
(公開前のソースではもっとマクロを使ってました。
あまりにもひどいくらいにマクロってしまって意味不明なエラーに悩んだりしたので
今後のメンテナンスなども考え、すこしだけ抑えてあります。)
○名称
各クラスの名称はオリジナルとは異なります。
オリジナルでは例えば b2World や b2Vec のように b2〜 で始まりますが、
Box2DLibでの名前は、bb2World や bb2Vec のように bb2〜 で始まるようにしています。
これはDLL内で名前が衝突・混乱しないように、かつ、
入力が面倒くさくならないようにするためです。
(気に入らなければ definemacro.h の マクロMNAME を変更して下さい。
簡単に変更できますが、元と同じ名前にするとコンパイルは通りますが
VBからの使用するときちょっと面倒な問題が発生します。
多分仕様だと思うのですが、回避方法がわからなかったのでそのままにしてます。)
定数(b2_PIなど)は Box2DLib.Settings クラス、 算術関数(b2Mulなど)は
Box2DLib.MathFunction クラスに纏めてあります。
いちいちタイプするのが面倒ならば、
Imports Box2DLib.Settings
Imports Box2DLib.MathFunction
としてください。
○メンバ
元の公開メンバ変数は、プロパティとして実装してます。
これはデータメンバの後に()はつけたくないなぁっていうのと、
Property文を使ってみたかった、ってぐらいの
どうでもいい理由からです。
ただ、ちょっとだけパフォーマンスを考えて構造体の中の構造体にアクセスするためのプロパティなどでは
毎回ラッパクラスを作るのではなく、必要に応じて作成するようにしています。
(ただし、ほとんどパフォーマンスアップにはなってないかもしれません)
メソッドの引数や戻り値については .Net Framework(正確にはVB)でサポートされる形式に変更しています。
○ライセンス
Box2DLib.DLLのライセンスはBox2Dのオリジナルライセンスに従います。
以上のようなコンセプトで
出来るだけ元のライブラリの使い方をそのまま使えるようにしたつもりです。
ただ結構動けばいいやって所があるのは愛嬌です(^^;
元ライブラリでキャストで行うようになっている部分については
(b2Shapeからb2CircleShapeにキャストするような場合)
staticなメソッド(CastFrom)でキャストするという安易な方法で逃げてますし、
配列の添え字チェックなどやってません。
あとContact関係はすっぽり省いています。
C++で作られたネイティブDLLを.Net Frameworkから使う為には
C++/CLIによるDLL作成という手段がもっともスマートかと思うのですが、
あまり情報がなかったので自分なりにこんな方法を試してみました。
たぶん、もっとスマートなやり方があるだろうと思いますが、
私にはこれが限界です。(^^;だれか優しく教えてください。
なお、Box2Dライブラリには.Net Frameworkへ移植しようとしているのでは
と思われるソースがちょろちょろ見受けられるのですが、
私には使うことができませんでした。(ドキュメントにも記述がない)
将来的には正式な「Box2D for .Net」が本家から提供されるかもしれません。