DxLibFanに戻る
- BMLDLLとは
- 最初に必要なもの
- BMLDLLを使うのに必要なツール、ライブラリ
- VisualC++での使い方
- Dev-C++での使い方
- サンプルプログラム DxLibを使ってBML Playerを作ろう
- Licence (ライセンス) (使用条件) (とても緩い使用条件ですよ^^;)
- Frequency asked Question (よく聞かれる質問) (FAQ) (Q & A)
- download BMLDLL (BMLDLLをダウンロードする)
BMLDLLとは
簡単に言うと、
libBulletMLをC言語で使う事が出来るようになる。
です。
DLLなので変なリンカ問題に悩まされずにすみます。
最初に必要なもの
BMLDLLを使うのに必要なもの
- Win32 Binaryを吐くことの出来るC言語コンパイラ(VisualC++6.0以降 奨励,Dev-C++ (MinGWは最新版のもの)
VisualC++での使い方
VC以外のコンパイラを使用しているユーザー向けの設定
各自、BMLDLL.lib(マルチスレッドを使うならば BMLDLLMT.lib)をリンクしてください。
そうすれば勝手にBMLDLL.dllを読み込んで関数を使える状態にしてくれます。
しかし、Borland製のものはライブラリ形式が違うため各自変換する必要があります。
また、上記のような方法で上手く行かない場合は、
LoadLibraryとGetModuleHandleを駆使してください。
以上です。
設定方法 VCパワーユーザー向け要約
- BMLDLL.hとその他必要なものをインクルードして関数を呼び出す。以上。
DxLibを使ってBML Playerを作ろう!
- まず使用するコンパイラはVisualC++。(それでないとDxLibは使えない)。
まずはテンプレート。以下のソースをコピペして下さい。
まぁ、こんな感じです。じゃぁソースを見ていきますか。
まぁ、見たまんま単純な構造なんですけど^^;
DxLibの関数については説明は省きますね。各自DxLibの関数リファレンス見る事^^
-
//BMLDLLを初期化 10000個の弾領域、スピードは1、200個の空き領域保存キュー
if(DKUTIL_FAILED(BML_Init(10000,1,200)))
{//error
return -1;
}
まず、最初にBMLDLLを使うにはBML_Init関数を呼び出します。
第一引数は弾の領域
第二引数は弾のデフォルトスピード
第3引数空き領域管理キューです。
戻り値はedk_Result型のenumです。
DKUTIL_FAILEDマクロを使うことで失敗を調べる事が出来ます。
ですのでこのような構文になっています。
-
//BulletMLが定義されたXMLを読み込む。
int bml = BML_LoadXMLFile(buff);
if(bml==-1) return -1;
BML_LoadXMLFileは、BulletMLが定義されたXMLを読み込むための関数です。
読み込んだ後、成功した場合はint型のハンドルを返します。
−1だとロード失敗です。
余談ですが、一部にBMLDLLが読み込むとBMLDLL自体がエラーするものがあります。
それは普通のBulletMLデータではなく、拡張されたBulletMLデータの可能性があります。
例えば弾幕やさんで取得したBulletMLデータの一つに以下のようなものがあります。以下のようなXML構文のものはエラーになってしまいます。
ですので、各自、このような弾幕は改造する必要があります。
-
{//60フレームに1回生成。
BML_CreateBullet(bml,
320,//生成する座標
240,
dummywork,//タスクワーク
sizeof(dummywork),
GetPlayerCollision//プレイヤーへの座標を得るコールバック関数
);
}
さて、一番の肝である弾の生成の部分にきました。
BML_CreateBullet関数は
第一引数から、X座標、Y座標、タスクワークへのアドレス、タスクワークのサイズ、プレイヤー座標を得るためのコールバック関数へのポインタ
です。
なぜ、第五引数にコールバック関数を入れる必要があるか。
例えば、二人プレイの出来るシューティングゲームを考えましょう。
その時、1Playerだけに誘導弾が来てしまったらあまりにも不公平でしょう。
では、弾が1Playerか2Playerのどちらに移動するかランダムに決めれば良いのでは?
と思っている方もいらっしゃるかもしれませんが、そうなると、1Playerと2Playerの座標のどっちにいくのかが毎回決められるので、
弾は画面内でブルブル震えるだけになってしまうと思います。
ですので、コールバック関数を用意したわけです。
コールバック関数の規定は以下のような感じなります。
BOOL CALLBACK GetPlayerCollision(BML_PLAYER_CALLBACK_DATA *data){
int x,y;
x = gPlayer.getX();
y = gPlayer.getY();
//プレイヤーの当たり判定の矩形をRECT型の
//BML_PLAYER_CALLBACK_DATA構造体メンバcollisionに入れる。
data->collision.left = x;
data->collision.top = y;
data->collision.right = x + 1;
data->collision.bottom = y + 1;
// data->result = TRUE;
return TRUE;
}
これだけです。このコールバック関数が成功したならTRUEをreturnするようにします。
-
//弾の移動 ここでフレームをひとつインクリメント
BML_Move();
見たまんま、弾の移動関数です。弾を移動させます。
-
//libBulletMLの処理
BML_Update();
これも見たまんま、libBulletMLが内部で行う処理を行います。
-
//そして、ソフトを終了する時は以下の関数を呼び出します。
BML_End();
- さて、ソースコードには出ていませんが、
弾の座標にアクセスして弾を描画したいのですが、どうすればいいのでしょうか?
BML_CreateBulletと並ぶ肝の部分ですね。
こんな感じの関数が定義されています。
さて、これらの関数を使って当たり判定のサンプルを示します。
まぁ、こんな感じですね。
このサンプルを見ればもう明白なはずです。イテレーションの仕方、削除の仕方等。
ちなみに、このサンプルの描画部分をまとめたのがBML_HELPER_DrawBullet関数です。
そして、画面外に出たら削除をしている部分をまとめたのがBML_HELPER_HitDelete関数です。
- さぁ!最後ですね。つかみはとれましたでしょうか?口癖のようですが、まぁ、こんな感じです。
BML_HELPER系の関数は一部しか説明してませんでしたね^^;
えーっと、これらは私が便利にする為に作った関数類なので各自、関数リファレンスを見てください^^;
さて!まとめです。いままでのフローチャートを見ましょう。
BML_Init();
loop *1
特定のタイミングでBML_CreateBullet
BML_Move
GetAdress系GetSentinel系を駆使して
弾データアクセスしてコリジョンチェック *2
BML_Update
*2と同じく、描画を行う。
}*1に戻る。
BML_End();
こんな感じです。
超簡単ですね^^いや〜これで超簡単に弾幕シューティングが出来るようになりますよ!作った甲斐があった〜〜ヽ(´ー`)ノ万歳
ではでは、またの機会にでもお話に付き合ってくれるとうれししいです。
Thank you very much!
Licence (使用条件)
BMLDLLのdoxygenマニュアルの方をご覧下さい。
Download
こちらからダウンロードして下さい。
また、Vectorでもダウンロード出来ます。(最新版ではない事が多い)
Frequently asked question(よく聞かれる質問)
技術的質問
Q: BMLDLL.dllが無いとWindowsに怒られるのですが、
A:BMLDLL.dllを自分のアプリケーションと同じフォルダにいれてください。
著作権に関して。
Q: BMLDLL.dllは再配布自由ですか?
A:自由にしてかまいません。