Category : [ C/C++/PG Tips ]
Date : 2004年12月24日 15:45
Next :
ぬおぅ・・・。 (2004年12月24日 18:22)
Prev :
曲の空気感、世界観 (2004年12月24日 13:16)
という訳で例の libBulletML の解説です。
んむ。付属のREADMEも意味不明ならば、検索で出てきた
「libBulletML」を組み込んでみる~C言語編~
とか言う解説サイトも、ぶっちゃけREADMEにちょっと羽が生えただけのような
ものだし・・・。
まぁそんな訳でlibBulletMLについて解説をば。
(※なお、あくまでコレは、自分が「このマニュアルじゃくそ過ぎる!!」とわめいて
マニュアルを無視して自分でソースを解析した結果をまとめたものです。
間違ったことを書いているかもしれませんのであらかじめご了承を…。)
とりあえずここではVC++6.0を用いて解説します。
1.bulletml.dll の作成
libbulletml.dsw はlibファイルに全て書き出す形式で、
bulletml.dsw はDLLを作成する形式です。
なお、ここでは bulletml.dsw の方を使います。
(てかどうも libbulletml.dsw の方は上手くいかない、と言うか解説サイトを
見る限りなにやら色々としないといけないらしく、面倒なので・・・。)
2.プロジェクトの設定(*1)
お次はヘッダファイルです。
libBulletML ディレクトリ内の src ディレクトリをコピーしてきます。
まぁディレクトリ名は変えた方が良いでしょう。"BulletML"ディレクトリ、とか。(*2)
なお、.cppのような要らないファイルもたくさん含まれていますが、
ここでは面倒なので省略します。面倒な人は丁寧に削除してください。
コピーしたら BulletML ディレクトリに対してパスを切ります。
また、使用するヘッダの中でboostを参照している物もあるので、
boostディレクトリに対してもパスを切る必要があります。
(て言うか私の環境では #include <xxxx.h> の奴も普通に
プロジェクトのパス切っただけで通っちゃいました。…良いのか?w)
3.派生クラスの作成(前書き)
で、何故こんなに分かり辛いのかって話ですが、
一つの理由として、イキナリ話が飛躍している、と言うのがあります。
BulletML、もとい libBulletML は複雑な弾幕をも記述することが可能ですが、
イキナリ「複雑な弾幕」に対応した処理の話を始めるので、
サッパリ意味不明になってしまう訳です。
後は BulletML を完全に理解しているものとして話を進めている、と言うのもあります。
よってここではまずは「単純な弾幕」(*3)の話をします。
4.派生クラスの作成(本題)
普通にクラスを一個作成してください。
なお、このクラスは一つの弾幕発生源(通常は敵一体)に相当します。
作成したら BulletMLRunner を継承させます。
なお、このクラスは BulletML/bulletmlrunner.h に定義されています。
ちなみにREADME内で
と言うコメントを見ても意味が分からない、
なんのためにあるのか良く分からない変数宣言があるかと思われます(爆
で、ぶっちゃけるとこれは別に要らない変数宣言です。
何でそんな"ゴミ"が書いてあるのかは後述するとして、
ここではとりあえず分かりやすくするために省略、
つまり書かないでおいてください。
5.メソッドのオーバーライド
が。
ここでは簡単な弾幕に関してのみ説明しますので、一部のメソッド、
もとい後述にて使用するXMLでは呼び出されないメソッドは省略します。
のでとりあえずは { return 0; } とかにでもしておいてください(爆
なお、オーバーライドする必要があるメソッドは以下の通りです。
あと、bulletmlrunner.h を見ても何言ってるのか良く分からないと思いますので(爆)
ついでに簡単な説明も入れておきます。
・double getAimDirection();
弾幕発生源から見た自機への角度を求め、復帰する内容を記述します。
・double getDefaultSpeed();
デフォルト速度。XMLにて速度指定がなされなかった場合は
この値を速度に使用します。
・void createSimpleBullet(double direction, double speed);
弾が発生するイベントが発生したとき呼び出されるメソッド。
角度と速度が引数として渡されるので、
「角度と速度を元に弾を生成する処理」を記述します。
・int getTurn();
ターン数を復帰させます。通常は現在までの総フレーム数、
例えばメインループのループカウンターです。
・コンストラクタ
READMEでは「最低二つのコンストラクタを~」とか書かれていますが、
ここでは分かりやすくするために以下のようにコンストラクタを
オーバーライドさせます。
派生クラス(BulletMLParser* bp) : BulletMLRunner(bp);
なお、処理内容は空(何もしない)で良いです。
6.XMLのパーサー及び各ターンごとのrun()
あ、ちなみに補足しておきますと、
BulletMLParser* bp = new BulletMLParserTinyXML("hoge.xml");
にてnewした BulletMLParserTinyXML ですが、
どうも自分の環境でdeleteしようとすると何故か落ちます。
「何故か落ちるんだけど…」と言う人はdeleteを外してみると良いでしょう。
また、解決方法を知ってる方は教えてください(笑
7.基本的な説明は以上です
8.謎の「Bullet* bullet_;」
さて、どうやって実装しようか、と言う話になるわけですが、
その一例が「Bullet* bullet_;」だったりします。
つまり、弾幕発生源の位置情報等を保持しているクラスを他に作り、
newする時にそのクラスへのポインタを
BulletCommand::BulletCommand(BulletMLParser* bp, Bullet* b)
: BulletMLRunner(bp), bullet_(b)
のような形で渡し、メンバ変数に保持する、と言う。
まぁあくまで一例なので、必ずそうする必要は無いかと思われます。
やり方はプログラマによりきり千差万別です。
好きな方法で実装して良いとおもいます。
以上。長くてゴメンナサイ。_| ̄|○
*1 : イキナリゲームプログラム本体のプロジェクトに追加するのもアリですが、
まずはプロトタイプとしてDOS窓のプロジェクトを作った方が良いかと思われます。
てか自分はそうしました。
*2 : 以下このディレクトリを BulletML としたものと仮定して話を進めます。
*3 : 一方向にしか進まず、また加速等もしない弾幕。
*4 : 計算方法を知らない人は自分で調べてください。
Trackback URL : http://www.nwhite.info/mt/trbk_haruhi.xcg/961
>GameDev/Link (from PukiWiki/TrackBack 0.2)
Tracked on 2005年02月16日 09:13