Commit 51dd2f8b authored by Kiste's avatar Kiste
Browse files

Fix encoding

parent 0752e4dd
libBulletML 0.0.5
・概要
・概要
弾幕記述言語 BulletML を扱う c++ ライブラリです。
これを用いることによって、豊富な記述力を持つ BulletML を、
XML解析の知識がなくても利用することができます。
弾幕記述言語 BulletML を扱う c++ ライブラリです。
 
XML解析の知識がなくても利用することができます。
グラフィックなどのゲームの他の部分とは完全に切り分けられているので、
安心してどんなソフトにでも使用することができます。
グラフィックなどのゲームの他の部分とは完全に切り分けられているので、
安心してどんなソフトにでも使用することができます。
プログラムに埋め込まれた弾幕記述に比べると遅いと思われますが、
解析時に全ての要素を enum 化しているため、
実行時の文字列比較などによる速度低下は起こりません。
プログラムに埋め込まれた弾幕記述に比べると遅いと思われますが、
解析時に全ての要素を enum 化しているため、
実行時の文字列比較などによる速度低下は起こりません。
BulletML ABAさんがデザインした弾幕記述言語です。
詳しくはこちらをどうぞ。
BulletML ABAさんがデザインした弾幕記述言語です。
詳しくはこちらをどうぞ。
http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/index.html
・使い方
・使い方
VC Borland C++ gcc で動作確認されています。
VC Borland C++ と gcc で動作確認されています。
このドキュメントは多少いい加減なので、わからないことがあれば、
拙作「白い弾幕くん」が完全な実用例となっています。
厄介な敵弾の操作が command.cc, command.h という
短いプログラムに収まっているのがわかるかと思います。
他に参考にすると良い部分には enemy.cc, enemy.h があります。
また、html/index.html が簡単な API リファレンスになるかもしれません。
このドキュメントは多少いい加減なので、わからないことがあれば、
拙作「白い弾幕くん」が完全な実用例となっています。
 
短いプログラムに収まっているのがわかるかと思います。
他に参考にすると良い部分には enemy.cc, enemy.h があります
また、html/index.html が簡単な API リファレンスになるかもしれません。
このライブラリは二種類の使い方が想定されています。
このライブラリは二種類の使い方が想定されています。
* 一つ目、イベント駆動型
* 一つ目、イベント駆動型
こちらの方が簡単な使い方です。
ただ、少し融通が利かない部分があるのが難点です。
こちらの方が簡単な使い方です。
ただ、少し融通が利かない部分があるのが難点です。
0. BulletML で記述された XML ファイルを用意します。
0. BulletML で記述された XML ファイルを用意します。
始めは「白い弾幕くん」や ABAさんの XML ファイルを用いれば良いでしょう。
また、README.bulletml にリファレンスがあります。
始めは「白い弾幕くん」や ABAさんの XML ファイルを用いれば良いでしょう。
また、README.bulletml にリファレンスがあります。
1. 必要なファイルをインクルードします。
1. 必要なファイルをインクルードします。
#include "bulletml/bulletmlparser.h"
#include "bulletml/bulletmlparser-tinyxml.h"
#include "bulletml/bulletmlrunner.h"
2. BulletMLRunner を継承したクラスを作成します。
2. BulletMLRunner を継承したクラスを作成します。
class BulletCommand : public BulletMLRunner {
// ...
// このクラスは操作する Bullet となんらかの手段で関連付けること。
// このクラスは操作する Bullet となんらかの手段で関連付けること。
Bullet* bullet_;
}
3. bulletmlrunner.h に記述されている純粋仮想関数を全て実装します。
3. bulletmlrunner.h に記述されている純粋仮想関数を全て実装します。
例えば、以下のようにします。
例えば、以下のようにします。
virtual void doVanish() {
bullet->die();
}
注意すべき点は一点だけです。
それは create で始まる二つのメソッドのオーバーライドについてです。
注意すべき点は一点だけです。
それは create で始まる二つのメソッドのオーバーライドについてです。
libBulletML では<action> を持つ弾と持たない弾の二つに分類されます。
<action> を持たない弾は等速運動を行うだけなので、
シンプルに実装した方が高速になることが期待されるため、
このような分類を行っています。
クライアントコードでも、この二つは区別した方が良いと思われます。
「白い弾幕くん」では Shot Enemy という二つのクラスを用いています。
libBulletML では<action> を持つ弾と持たない弾の二つに分類されます。
<action> を持たない弾は等速運動を行うだけなので、
シンプルに実装した方が高速になることが期待されるため、
このような分類を行っています。
クライアントコードでも、この二つは区別した方が良いと思われます。
「白い弾幕くん」では Shot と Enemy という二つのクラスを用いています。
さて、<action> を持たない弾を作成する <fire> エレメントを実行すると、
BulletMLRunner createSimpleBullet を呼び出します。
これは角度と速度が渡されているので、それに従った弾を作成します。
さて、<action> を持たない弾を作成する <fire> エレメントを実行すると、
BulletMLRunner createSimpleBullet を呼び出します。
これは角度と速度が渡されているので、それに従った弾を作成します。
<action> を持つ場合、先程の例に加えて、
BulletMLState* state というオブジェクトが渡されます。
これは、BulletML のパース中の情報を残すためのもので、
クライアントコードでこの内容を気にする必要はありません。
ただ、新しく生まれた弾の BulletMLRunner 派生クラスを
作るときにこれを渡す必要があります。
BulletMLRunner の生成については次の項で説明します。
<action> を持つ場合、先程の例に加えて、
BulletMLState* state というオブジェクトが渡されます。
これは、BulletML のパース中の情報を残すためのもので、
クライアントコードでこの内容を気にする必要はありません。
ただ、新しく生まれた弾の BulletMLRunner 派生クラスを
作るときにこれを渡す必要があります。
BulletMLRunner の生成については次の項で説明します。
4. BulletMLRunner 派生クラスの生成
4. BulletMLRunner 派生クラスの生成
libBulletML では弾源は二種類に分類されます。
これは、xmlファイルのドキュメント全てを持って生成され、
全ての弾の源となる一次弾源と、
他の弾源から <action> を持つ <fire> エレメントによって作成された、
二次三次…弾源です。
libBulletML では弾源は二種類に分類されます。
これは、xmlファイルのドキュメント全てを持って生成され、
全ての弾の源となる一次弾源と、
他の弾源から <action> を持つ <fire> エレメントによって作成された、
二次三次…弾源です。
この違いから、BulletMLRunner 派生クラスは
最低二つのコンストラクタを用意する必要があります。
この違いから、BulletMLRunner 派生クラスは
最低二つのコンストラクタを用意する必要があります。
前者のコンストラクタは例えば以下のように実装します。
前者のコンストラクタは例えば以下のように実装します。
BulletCommand::BulletCommand(BulletMLParser* bp, Bullet* b)
: BulletMLRunner(bp), bullet_(b)
後者のコンストラクタは例えば以下のように実装します。
後者のコンストラクタは例えば以下のように実装します。
BulletCommand::BulletCommand(BulletMLState* bs, Bullet* b)
: BulletMLRunner(bs), bullet_(b)
5. BulletML ドキュメントを生成します。
5. BulletML ドキュメントを生成します。
BulletMLParser* bp = new BulletMLParserTinyXML("hoge.xml");
bp->build();
この作業は実際の実行時に行うには重いので、
プログラムの開始時などにまとめて読みこむことをお勧めします。
この作業は実際の実行時に行うには重いので、
プログラムの開始時などにまとめて読みこむことをお勧めします。
6. 先程のドキュメントを用いた一次弾源を生成します。
6. 先程のドキュメントを用いた一次弾源を生成します。
BulletCommand* bc = new BulletCommand(bp)
7. 各ターンに全ての BulletCommand を実行します。
7. 各ターンに全ての BulletCommand を実行します
bc->run();
これだけで、後はイベント駆動式で弾の状態変化を呼びだしてくれます。
これだけで、後はイベント駆動式で弾の状態変化を呼びだしてくれます。
また、何か問題が起こった場合、libBulletML BulletMLError を投げます。
補足すると便利なこともあるでしょう。
 
補足すると便利なこともあるでしょう。
* 二つ目、自力でツリー解析
* 二つ目、自力でツリー解析
こちらはあまり想定されていない使い方ですが、それなりの恩恵はあります。
こちらはあまり想定されていない使い方ですが、それなりの恩恵はあります。
1. 必要なファイルのインクルードをします。
1. 必要なファイルのインクルードをします。
#include "bulletml/bulletmlparser.h"
#include "bulletml/bulletmlparser-tinyxml.h"
#include "bulletml/bulletmltree.h"
2. BulletML ドキュメントを生成します。
2. BulletML ドキュメントを生成します。
BulletMLParser* bp = new BulletMLParserTinyXML("hoge.xml");
bp->build();
3. BulletMLParser からトップのアクションを取得します。
3. BulletMLParser からトップのアクションを取得します。
const std::vector<BulletMLNode*>& nodes = bp->getTopActions();
4. 自力でツリーを解析します。
4. 自力でツリーを解析します。
bulletmltree.h 内を参考にツリーを解析して敵弾を動かしてください。
bulletmltree.h 内を参考にツリーを解析して敵弾を動かしてください。
・いろいろ
・いろいろ
こんな機能が欲しいとかあればメールお願いします。
こんな機能が欲しいとかあればメールお願いします。
修正BSDライセンスに従います。
修正BSDライセンスに従います。
TinyXMLにお世話になっています。
TinyXMLにお世話になっています。
http://www.gibaradunn.srac.org/tiny/index.shtml
ドキュメント生成に Doxygen を用いています。
ドキュメント生成に Doxygen を用いています。
http://www.stack.nl/~dimitri/doxygen/
ToDo
・ToDo
1. 仕様との整合
<horizontal><vertical>attribute
1. 仕様との整合
・<horizontal><vertical>のattribute
2. 独自の拡張をしやすく
・元仕様にないタグやアトリビュート対応
2. 独自の拡張をしやすく
・元仕様にないタグやアトリビュート対応
3. エラーメッセージ、エラーを投げる場面の充実
3. エラーメッセージ、エラーを投げる場面の充実
4. 各種情報を入手しやすく。
4. 各種情報を入手しやすく。
・修正BSDライセンス
・修正BSDライセンス
Copyright (c) 2003, shinichiro.h All rights reserved.
......
BulletML Reference ver. 0.21 (c) 長健太(ABA."Saba") ABA Games
BulletML Reference ver. 0.21 (c) 長健太(ABA."Saba") ABA Games
BulletMLの簡易リファレンスです。
BulletMLの簡易リファレンスです。
<bulletml> - Defines the BulletML's body ━━━━━━━━━━━━━━━━━━━
<bulletml> - Defines the BulletML's body ━━━━━━━━━━━━━━━━━━━
Attribute - type = (none | vertical | horizontal)
Attribute - type = (none | vertical | horizontal)
Contents - (bullet | action | fire)*
Contents - (bullet | action | fire)*
BulletML本体を定義します。
BulletML本体を定義します。
type属性は、この弾幕が縦スクロールシューティング用か、横スクロールシューティン
グ用かを規定します。
type属性は、この弾幕が縦スクロールシューティング用か、横スクロールシューティン
グ用かを規定します。
<bullet> - Defines attributes of a bullet ━━━━━━━━━━━━━━━━━━
<bullet> - Defines attributes of a bullet ━━━━━━━━━━━━━━━━━━
Attribute - label = STRING
Attribute - label = STRING
Contents - direction?, speed?, (action | actionRef)*
Contents - direction?, speed?, (action | actionRef)*
Exapmle
Exapmle
<bullet label="downAccel">
<direction>270</direction>
......@@ -32,19 +32,19 @@ type掳
</action>
</bullet>
弾の方向、速度およびアクションを定義します。
弾の方向、速度およびアクションを定義します。
ラベル属性でラベル名をつけることができます。ラベル付けされたbullet要素は、
bulletRef要素によって参照されます。
ラベル属性でラベル名をつけることができます。ラベル付けされたbullet要素は、
bulletRef要素によって参照されます。
<action> - Defines the action of bullet ━━━━━━━━━━━━━━━━━━━
<action> - Defines the action of bullet ━━━━━━━━━━━━━━━━━━━
Attribute - label = STRING
Attribute - label = STRING
Contents - (repeat | fire | fireRef | changeSpeed | changeDirection | accel
Contents - (repeat | fire | fireRef | changeSpeed | changeDirection | accel
| wait | vanish | action | actionRef)*
Exapmle
Exapmle
<action>
<changeSpeed>
......@@ -60,16 +60,16 @@ bulletRef
<vanish/>
</action>
弾のアクションを定義します。ラベル付けされたaction要素は、actionRef要素によって
参照されます。
弾のアクションを定義します。ラベル付けされたaction要素は、actionRef要素によって
参照されます。
<fire> - Fires a bullet ━━━━━━━━━━━━━━━━━━━━━━━━━━━
<fire> - Fires a bullet ━━━━━━━━━━━━━━━━━━━━━━━━━━━
Attribute - label = STRING
Attribute - label = STRING
Contents - direction?, speed?, (bullet | bulletRef)
Contents - direction?, speed?, (bullet | bulletRef)
Exapmle
Exapmle
<fire>
<direction type="absolute">270</direction>
......@@ -77,43 +77,43 @@ bulletRef
<bulletRef label="rocket"/>
</fire>
弾を<direction>度方向に速度<speed>で撃ちます。ラベル付けされたfire要素は、
fireRef要素によって参照されます。
弾を<direction>度方向に速度<speed>で撃ちます。ラベル付けされたfire要素は、
fireRef要素によって参照されます。
<changeDirection> - Changes the direction of bullet ━━━━━━━━━━━━━
<changeDirection> - Changes the direction of bullet ━━━━━━━━━━━━━
Contents - direction, term
Contents - direction, term
弾の方向を<direction>度に<term>フレームかけて曲げます。 1フレームは1/60秒です。
弾の方向を<direction>度に<term>フレームかけて曲げます。 1フレームは1/60秒です。
<changeSpeed> - Changes the speed of bullet ━━━━━━━━━━━━━━━━━
<changeSpeed> - Changes the speed of bullet ━━━━━━━━━━━━━━━━━
Contents - speed, term
Contents - speed, term
弾の速度を<speed><term>フレームかけて変えます。
弾の速度を<speed>に<term>フレームかけて変えます。
<accel> - Accelerates a bullet ━━━━━━━━━━━━━━━━━━━━━━━━
<accel> - Accelerates a bullet ━━━━━━━━━━━━━━━━━━━━━━━━
Contents - horizontal?, vertical?, term
Contents - horizontal?, vertical?, term
弾を水平方向に<horizontal>、垂直方向に<vertical> <term>フレームかけて加速しま
す。
弾を水平方向に<horizontal>、垂直方向に<vertical>、 <term>フレームかけて加速しま
す。
<wait> - Waits ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
<wait> - Waits ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Contents - NUMBER
Contents - NUMBER
NUMBERフレーム待ちます。
NUMBERフレーム待ちます。
<vanish> - Vanishes a bullet ━━━━━━━━━━━━━━━━━━━━━━━━━
<vanish> - Vanishes a bullet ━━━━━━━━━━━━━━━━━━━━━━━━━
弾を消します。
弾を消します。
<repeat> - Repeats an action ━━━━━━━━━━━━━━━━━━━━━━━━━
<repeat> - Repeats an action ━━━━━━━━━━━━━━━━━━━━━━━━━
Contents - times, (action | actionRef)
Contents - times, (action | actionRef)
Exapmle
Exapmle
<repeat>
<times>100</times>
......@@ -126,120 +126,120 @@ NUMBER
</action>
</repeat>
アクションを<times>回繰り返します。
アクションを<times>回繰り返します。
<direction> - Specifies a direction ━━━━━━━━━━━━━━━━━━━━━
<direction> - Specifies a direction ━━━━━━━━━━━━━━━━━━━━━
Attribute - type = (aim | absolute | relative | sequence)
Attribute - type = (aim | absolute | relative | sequence)
Contents - NUMBER
Contents - NUMBER
方向を度単位で指定します。
方向を度単位で指定します。
type"aim"の場合、自機を狙う方向が0の相対値になります。
type"aim"の場合、自機を狙う方向が0の相対値になります。
type"absolute"の場合、NUMBERは絶対値(上方向が0で時計回り)です。
type"absolute"の場合、NUMBERは絶対値(上方向が0で時計回り)です。
type"relative"の場合、NUMBERはこの弾の方向が0の相対値になります。
type"relative"の場合、NUMBERはこの弾の方向が0の相対値になります。
type"sequence"の場合、直前の弾を撃った方向が0の相対値になります。
type"sequence"の場合、直前の弾を撃った方向が0の相対値になります。
<speed> - Specifies a speed ━━━━━━━━━━━━━━━━━━━━━━━━━
<speed> - Specifies a speed ━━━━━━━━━━━━━━━━━━━━━━━━━
Attribute - type = (absolute | relative | sequence)
Attribute - type = (absolute | relative | sequence)
Contents - NUMBER
Contents - NUMBER
速度を指定します。
速度を指定します。
type"relative"の場合、 changeSpeed要素内では現在の弾の速度との相対値、それ以
外の要素内ではこの弾の速度との相対値です。
type"relative"の場合、 changeSpeed要素内では現在の弾の速度との相対値、それ以
外の要素内ではこの弾の速度との相対値です。
type"sequence"の場合、 changeSpeed要素内では弾の速度を連続的に変化させ、それ
以外の要素内では直前の弾の速度との相対値です。
type"sequence"の場合、 changeSpeed要素内では弾の速度を連続的に変化させ、それ
以外の要素内では直前の弾の速度との相対値です。
<horizontal> - Specifies the acceleration in a horizontal line ━━━━━━━━
<horizontal> - Specifies the acceleration in a horizontal line ━━━━━━━━
Attribute - type = (absolute | relative | sequence)
Attribute - type = (absolute | relative | sequence)
Contents - NUMBER
Contents - NUMBER
水平方向の弾の加速度を指定します。
水平方向の弾の加速度を指定します。
type"relative"の場合、現在の弾の速度との相対値です。 type"sequence"の場合、
加速度を連続的に変化させます。
 
加速度を連続的に変化させます。
<vertical> - Specifies the acceleration in a vertical line ━━━━━━━━━━
<vertical> - Specifies the acceleration in a vertical line ━━━━━━━━━━
Attribute - type = (absolute | relative | sequence)
Attribute - type = (absolute | relative | sequence)
Contents - NUMBER
Contents - NUMBER
垂直方向の弾の加速度を指定します。
垂直方向の弾の加速度を指定します。
type"sequence"の場合、現在の弾の速度との相対値です。 type"sequence"の場合、
加速度を連続的に変化させます。
 
加速度を連続的に変化させます。
<term> - Specifies a term ━━━━━━━━━━━━━━━━━━━━━━━━━━
<term> - Specifies a term ━━━━━━━━━━━━━━━━━━━━━━━━━━
Contents - NUMBER
Contents - NUMBER
期間を指定します。
期間を指定します。
<times> - Specifies the number of times ━━━━━━━━━━━━━━━━━━━
<times> - Specifies the number of times ━━━━━━━━━━━━━━━━━━━
Contents - NUMBER
Contents - NUMBER
繰り返し回数を指定します。
繰り返し回数を指定します。
<bulletRef> - Refers to the bullet ━━━━━━━━━━━━━━━━━━━━━━
<bulletRef> - Refers to the bullet ━━━━━━━━━━━━━━━━━━━━━━
Attribute - label = STRING
Attribute - label = STRING
Contents - param*
Contents - param*
ラベル付けされたbullet要素を参照します。この要素は同名のラベルでラベル付けされ
たbullet要素と同じに扱われます。
ラベル付けされたbullet要素を参照します。この要素は同名のラベルでラベル付けされ
たbullet要素と同じに扱われます。
参照されたbullet要素内の変数($1, $2, $3, ...)は、 <param>要素に指定された数値
に置き換えられます。(最初に出現したparam要素が$1に、次に出現したparam要素が$2
に、...
参照されたbullet要素内の変数($1, $2, $3, ...)は、 <param>要素に指定された数値
に置き換えられます。(最初に出現したparam要素が$1に、次に出現したparam要素が$2
に、...
<actionRef> - Refers to the action ━━━━━━━━━━━━━━━━━━━━━━
<actionRef> - Refers to the action ━━━━━━━━━━━━━━━━━━━━━━
Attribute - label = STRING
Attribute - label = STRING
Contents - param*
Contents - param*
ラベル付けされたaction要素を参照します。この要素は同名のラベルでラベル付けされ
たaction要素と同じに扱われます。
ラベル付けされたaction要素を参照します。この要素は同名のラベルでラベル付けされ
たaction要素と同じに扱われます。
参照されたaction要素内の変数は、<param>要素に指定された数値に置き換えられます。
参照されたaction要素内の変数は、<param>要素に指定された数値に置き換えられます。
<fireRef> - Refers to the fire action ━━━━━━━━━━━━━━━━━━━━
<fireRef> - Refers to the fire action ━━━━━━━━━━━━━━━━━━━━
Attribute - label = STRING
Attribute - label = STRING
Contents - param*
Contents - param*
ラベル付けされたfire要素を参照します。この要素は同名のラベルでラベル付けされた
fire要素と同じに扱われます。
ラベル付けされたfire要素を参照します。この要素は同名のラベルでラベル付けされた
fire要素と同じに扱われます。
参照されたfire要素内の変数は、<param>要素に指定された数値に置き換えられます。
参照されたfire要素内の変数は、<param>要素に指定された数値に置き換えられます。
<param> - Specifies the parameter ━━━━━━━━━━━━━━━━━━━━━━
<param> - Specifies the parameter ━━━━━━━━━━━━━━━━━━━━━━
Contents - NUMBER
Contents - NUMBER
パラメタを指定します。
パラメタを指定します。
STRING - any string ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STRING - any string ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ラベル用文字列です。
ラベル用文字列です。
NUMBER - expression ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
NUMBER - expression ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Exapmles
Exapmles
35
360/16
......@@ -247,8 +247,8 @@ NUMBER - expression
180-$rank*20
(2+$1)*0.3
数値を指定するための式です。
数値を指定するための式です。
四則演算と剰余算、括弧、変数(パラメタ用に$1, $2, $3...、乱数(0から1までの値)
用に$rand、難易度(0から1までの値)用に$rank)が使えます。
四則演算と剰余算、括弧、変数(パラメタ用に$1, $2, $3...、乱数(0から1までの値)
用に$rand、難易度(0から1までの値)用に$rank)が使えます。
// bulletml.cpp : DLL アプリケーション用のエントリ ポイントを定義します。
// bulletml.cpp : DLL アプリケーション用のエントリ ポイントを定義します。
//
#include "stdafx.h"
......@@ -21,17 +21,17 @@ BOOL APIENTRY DllMain( HANDLE hModule,
}
// これはエクスポートされた変数の例です。
// これはエクスポートされた変数の例です。
BULLETML_API int nBulletml=0;
// これはエクスポートされた関数の例です。
// これはエクスポートされた関数の例です。
BULLETML_API int fnBulletml(void)
{
return 42;
}
// これはエクスポートされたクラスのコンストラクタです。
// クラスの定義については bulletml.h を参照してください。
// これはエクスポートされたクラスのコンストラクタです。
// クラスの定義については bulletml.h を参照してください。
CBulletml::CBulletml()
{
return;
......
# Microsoft Developer Studio Project File - Name="bulletml" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** 編集しないでください **
# ** 編集しないでください **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=bulletml - Win32 Debug
!MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。