Commit 83580d22 authored by Kiste's avatar Kiste
Browse files

Clarify LICENSE with README

parent 8dd36f4d
Copyright (c) 2003, shinichiro.h All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* The name of the author may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
shinichiro.h
hamaji@nii.ac.jp
http://shinh.skr.jp/
libBulletML 0.0.5
・概要
弾幕記述言語 BulletML を扱う c++ ライブラリです。
これを用いることによって、豊富な記述力を持つ BulletML を、
XML解析の知識がなくても利用することができます。
グラフィックなどのゲームの他の部分とは完全に切り分けられているので、
安心してどんなソフトにでも使用することができます。
プログラムに埋め込まれた弾幕記述に比べると遅いと思われますが、
解析時に全ての要素を enum 化しているため、
実行時の文字列比較などによる速度低下は起こりません。
BulletML は ABAさんがデザインした弾幕記述言語です。
詳しくはこちらをどうぞ。
http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/index.html
・使い方
VC と Borland C++ と gcc で動作確認されています。
このドキュメントは多少いい加減なので、わからないことがあれば、
拙作「白い弾幕くん」が完全な実用例となっています。
厄介な敵弾の操作が command.cc, command.h という
短いプログラムに収まっているのがわかるかと思います。
他に参考にすると良い部分には enemy.cc, enemy.h があります。
また、html/index.html が簡単な API リファレンスになるかもしれません。
このライブラリは二種類の使い方が想定されています。
* 一つ目、イベント駆動型
こちらの方が簡単な使い方です。
ただ、少し融通が利かない部分があるのが難点です。
0. BulletML で記述された XML ファイルを用意します。
始めは「白い弾幕くん」や ABAさんの XML ファイルを用いれば良いでしょう。
また、README.bulletml にリファレンスがあります。
1. 必要なファイルをインクルードします。
#include "bulletml/bulletmlparser.h"
#include "bulletml/bulletmlparser-tinyxml.h"
#include "bulletml/bulletmlrunner.h"
2. BulletMLRunner を継承したクラスを作成します。
class BulletCommand : public BulletMLRunner {
// ...
// このクラスは操作する Bullet となんらかの手段で関連付けること。
Bullet* bullet_;
}
3. bulletmlrunner.h に記述されている純粋仮想関数を全て実装します。
例えば、以下のようにします。
virtual void doVanish() {
bullet->die();
}
注意すべき点は一点だけです。
それは create で始まる二つのメソッドのオーバーライドについてです。
libBulletML では<action> を持つ弾と持たない弾の二つに分類されます。
<action> を持たない弾は等速運動を行うだけなので、
シンプルに実装した方が高速になることが期待されるため、
このような分類を行っています。
クライアントコードでも、この二つは区別した方が良いと思われます。
「白い弾幕くん」では Shot と Enemy という二つのクラスを用いています。
さて、<action> を持たない弾を作成する <fire> エレメントを実行すると、
BulletMLRunner は createSimpleBullet を呼び出します。
これは角度と速度が渡されているので、それに従った弾を作成します。
<action> を持つ場合、先程の例に加えて、
BulletMLState* state というオブジェクトが渡されます。
これは、BulletML のパース中の情報を残すためのもので、
クライアントコードでこの内容を気にする必要はありません。
ただ、新しく生まれた弾の BulletMLRunner 派生クラスを
作るときにこれを渡す必要があります。
BulletMLRunner の生成については次の項で説明します。
4. BulletMLRunner 派生クラスの生成
libBulletML では弾源は二種類に分類されます。
これは、xmlファイルのドキュメント全てを持って生成され、
全ての弾の源となる一次弾源と、
他の弾源から <action> を持つ <fire> エレメントによって作成された、
二次三次…弾源です。
この違いから、BulletMLRunner 派生クラスは
最低二つのコンストラクタを用意する必要があります。
前者のコンストラクタは例えば以下のように実装します。
BulletCommand::BulletCommand(BulletMLParser* bp, Bullet* b)
: BulletMLRunner(bp), bullet_(b)
後者のコンストラクタは例えば以下のように実装します。
BulletCommand::BulletCommand(BulletMLState* bs, Bullet* b)
: BulletMLRunner(bs), bullet_(b)
5. BulletML ドキュメントを生成します。
BulletMLParser* bp = new BulletMLParserTinyXML("hoge.xml");
bp->build();
この作業は実際の実行時に行うには重いので、
プログラムの開始時などにまとめて読みこむことをお勧めします。
6. 先程のドキュメントを用いた一次弾源を生成します。
BulletCommand* bc = new BulletCommand(bp)
7. 各ターンに全ての BulletCommand を実行します。
bc->run();
これだけで、後はイベント駆動式で弾の状態変化を呼びだしてくれます。
また、何か問題が起こった場合、libBulletML は BulletMLError を投げます。
補足すると便利なこともあるでしょう。
* 二つ目、自力でツリー解析
こちらはあまり想定されていない使い方ですが、それなりの恩恵はあります。
1. 必要なファイルのインクルードをします。
#include "bulletml/bulletmlparser.h"
#include "bulletml/bulletmlparser-tinyxml.h"
#include "bulletml/bulletmltree.h"
2. BulletML ドキュメントを生成します。
BulletMLParser* bp = new BulletMLParserTinyXML("hoge.xml");
bp->build();
3. BulletMLParser からトップのアクションを取得します。
const std::vector<BulletMLNode*>& nodes = bp->getTopActions();
4. 自力でツリーを解析します。
bulletmltree.h 内を参考にツリーを解析して敵弾を動かしてください。
・いろいろ
こんな機能が欲しいとかあればメールお願いします。
修正BSDライセンスに従います。
TinyXMLにお世話になっています。
http://www.gibaradunn.srac.org/tiny/index.shtml
ドキュメント生成に Doxygen を用いています。
http://www.stack.nl/~dimitri/doxygen/
・ToDo
1. 仕様との整合
・<horizontal><vertical>のattribute
2. 独自の拡張をしやすく
・元仕様にないタグやアトリビュート対応
3. エラーメッセージ、エラーを投げる場面の充実
4. 各種情報を入手しやすく。
・修正BSDライセンス
Copyright (c) 2003, shinichiro.h All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* The name of the author may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
shinichiro.h
hamaji@nii.ac.jp
http://shinh.skr.jp/
BulletML Reference ver. 0.21 (c) 長健太(ABA."Saba") ABA Games
BulletMLの簡易リファレンスです。
<bulletml> - Defines the BulletML's body ━━━━━━━━━━━━━━━━━━━
・ Attribute - type = (none | vertical | horizontal)
・ Contents - (bullet | action | fire)*
BulletML本体を定義します。
type属性は、この弾幕が縦スクロールシューティング用か、横スクロールシューティン
グ用かを規定します。
<bullet> - Defines attributes of a bullet ━━━━━━━━━━━━━━━━━━
・ Attribute - label = STRING
・ Contents - direction?, speed?, (action | actionRef)*
・ Exapmle
<bullet label="downAccel">
<direction>270</direction>
<speed>2</speed>
<action>
<accel>
<vertical>3</vertical>
<term>120</term>
</accel>
</action>
</bullet>
弾の方向、速度およびアクションを定義します。
ラベル属性でラベル名をつけることができます。ラベル付けされたbullet要素は、
bulletRef要素によって参照されます。
<action> - Defines the action of bullet ━━━━━━━━━━━━━━━━━━━
・ Attribute - label = STRING
・ Contents - (repeat | fire | fireRef | changeSpeed | changeDirection | accel
| wait | vanish | action | actionRef)*
・ Exapmle
<action>
<changeSpeed>
<speed>0</speed>
<term>60</term>
</changeSpeed>
<wait>60</wait>
<fire><bullet/></fire>
<fire>
<direction type="absolute">330+$rand*25</direction>
<bulletRef label="downAccel"/>
</fire>
<vanish/>
</action>
弾のアクションを定義します。ラベル付けされたaction要素は、actionRef要素によって
参照されます。
<fire> - Fires a bullet ━━━━━━━━━━━━━━━━━━━━━━━━━━━
・ Attribute - label = STRING
・ Contents - direction?, speed?, (bullet | bulletRef)
・ Exapmle
<fire>
<direction type="absolute">270</direction>
<speed>2</speed>
<bulletRef label="rocket"/>
</fire>
弾を<direction>度方向に速度<speed>で撃ちます。ラベル付けされたfire要素は、
fireRef要素によって参照されます。
<changeDirection> - Changes the direction of bullet ━━━━━━━━━━━━━
・ Contents - direction, term
弾の方向を<direction>度に<term>フレームかけて曲げます。 1フレームは1/60秒です。
<changeSpeed> - Changes the speed of bullet ━━━━━━━━━━━━━━━━━
・ Contents - speed, term
弾の速度を<speed>に<term>フレームかけて変えます。
<accel> - Accelerates a bullet ━━━━━━━━━━━━━━━━━━━━━━━━
・ Contents - horizontal?, vertical?, term
弾を水平方向に<horizontal>、垂直方向に<vertical>、 <term>フレームかけて加速しま
す。
<wait> - Waits ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・ Contents - NUMBER
NUMBERフレーム待ちます。
<vanish> - Vanishes a bullet ━━━━━━━━━━━━━━━━━━━━━━━━━
弾を消します。
<repeat> - Repeats an action ━━━━━━━━━━━━━━━━━━━━━━━━━
・ Contents - times, (action | actionRef)
・ Exapmle
<repeat>
<times>100</times>
<action>
<fire>
<direction type="absolute">220+$rand*100</direction>
<bulletRef label="backBurst"/>
</fire>
<wait>6</wait>
</action>
</repeat>
アクションを<times>回繰り返します。
<direction> - Specifies a direction ━━━━━━━━━━━━━━━━━━━━━
・ Attribute - type = (aim | absolute | relative | sequence)
・ Contents - NUMBER
方向を度単位で指定します。
typeが"aim"の場合、自機を狙う方向が0の相対値になります。
typeが"absolute"の場合、NUMBERは絶対値(上方向が0で時計回り)です。
typeが"relative"の場合、NUMBERはこの弾の方向が0の相対値になります。
typeが"sequence"の場合、直前の弾を撃った方向が0の相対値になります。
<speed> - Specifies a speed ━━━━━━━━━━━━━━━━━━━━━━━━━
・ Attribute - type = (absolute | relative | sequence)
・ Contents - NUMBER
速度を指定します。
typeが"relative"の場合、 changeSpeed要素内では現在の弾の速度との相対値、それ以
外の要素内ではこの弾の速度との相対値です。
typeが"sequence"の場合、 changeSpeed要素内では弾の速度を連続的に変化させ、それ
以外の要素内では直前の弾の速度との相対値です。
<horizontal> - Specifies the acceleration in a horizontal line ━━━━━━━━
・ Attribute - type = (absolute | relative | sequence)
・ Contents - NUMBER
水平方向の弾の加速度を指定します。
typeが"relative"の場合、現在の弾の速度との相対値です。 typeが"sequence"の場合、
加速度を連続的に変化させます。
<vertical> - Specifies the acceleration in a vertical line ━━━━━━━━━━
・ Attribute - type = (absolute | relative | sequence)
・ Contents - NUMBER
垂直方向の弾の加速度を指定します。
typeが"sequence"の場合、現在の弾の速度との相対値です。 typeが"sequence"の場合、
加速度を連続的に変化させます。
<term> - Specifies a term ━━━━━━━━━━━━━━━━━━━━━━━━━━
・ Contents - NUMBER
期間を指定します。
<times> - Specifies the number of times ━━━━━━━━━━━━━━━━━━━
・ Contents - NUMBER
繰り返し回数を指定します。
<bulletRef> - Refers to the bullet ━━━━━━━━━━━━━━━━━━━━━━
・ Attribute - label = STRING
・ Contents - param*
ラベル付けされたbullet要素を参照します。この要素は同名のラベルでラベル付けされ
たbullet要素と同じに扱われます。
参照されたbullet要素内の変数($1, $2, $3, ...)は、 <param>要素に指定された数値
に置き換えられます。(最初に出現したparam要素が$1に、次に出現したparam要素が$2
に、...)
<actionRef> - Refers to the action ━━━━━━━━━━━━━━━━━━━━━━
・ Attribute - label = STRING
・ Contents - param*
ラベル付けされたaction要素を参照します。この要素は同名のラベルでラベル付けされ
たaction要素と同じに扱われます。
参照されたaction要素内の変数は、<param>要素に指定された数値に置き換えられます。
<fireRef> - Refers to the fire action ━━━━━━━━━━━━━━━━━━━━
・ Attribute - label = STRING
・ Contents - param*
ラベル付けされたfire要素を参照します。この要素は同名のラベルでラベル付けされた
fire要素と同じに扱われます。
参照されたfire要素内の変数は、<param>要素に指定された数値に置き換えられます。
<param> - Specifies the parameter ━━━━━━━━━━━━━━━━━━━━━━
・ Contents - NUMBER
パラメタを指定します。
STRING - any string ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ラベル用文字列です。
NUMBER - expression ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・ Exapmles
35
360/16
0.7 + 0.9*$rand
180-$rank*20
(2+$1)*0.3
数値を指定するための式です。
四則演算と剰余算、括弧、変数(パラメタ用に$1, $2, $3...、乱数(0から1までの値)
用に$rand、難易度(0から1までの値)用に$rank)が使えます。
libBulletML 0.0.5
* Abstract
It is a C++ library to handle BulletML, the Bullet Markup
Language. You can use BulletML in your program without bothering to
parse XML.
If you want to know BulletML more, please see following web site by
ABA (author of BulletML):
http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/index_e.html
* Usage
You can use it with VC and BorlandC++ and gcc and I wish, almost all
compiler that supports standard C++.
An example of this library is available in my software "siroi
danmakukun":
http://user.ecc.u-tokyo.ac.jp/~s31552/wp/sdmkun/sdmkun-1.5.6.zip
You can see usage of this library in src/command_bulletml.* .
* Tutorial
This library's basic usage is event driven model.
0. Get XML file written in BulletML.
You can use BulletML file in "siroi danmakukun". (bosses.d/*.xml in
archive)
1. Include headers
#include "bulletml/bulletmlparser.h"
#include "bulletml/bulletmlparser-tinyxml.h"
#include "bulletml/bulletmlrunner.h"
2. Create class that inherits BulletMLRunner
class BulletCommand : public BulletMLRunner {
// ...
// the bullet you will handle
Bullet* bullet_;
}
3. Implement all pure virtual function defined in bulletmlrunner.h
For example:
class BulletCommand : public BulletMLRunner {
virtual void doVanish() {
bullet_->die();
}
// ... and other pure virtual functions
}
createSimpleBullet and createBullet method should be implemented
carefully. In libBulletML, all bullets are divided to two
types. createSimpleBullet type does not have <action>, createBullet
type has <action>. For example, "siroi danmakukun" uses two class:
Shot and Enemy.
When libBulletML handle <fire> element that does not have <action>
element, BulletMLRunner calls createSimpleBullet method with two
arguments: direction and speed.
In the other hand, if <fire> element has <action> element,
BulletMLRunner calls createBullet method with three arguments:
direction, speed, and state. You should not care the detail of the
state argument. But it should be given to the class derived from
BulletMLRunner in its constructor. The creation of this class is
described in next section.
4. Create of the class derived from BulletMLRunner
In libBulletML, the batteries are divided two types. One type is the
battery that is defined in <action label="top"> (first order battery),
and one type is the battery that is created by the other battery
(second, third, forth... battery).
Then, you should create two constructors to handle these two kind of
batteries.
For example, first order battery is implemented like following:
BulletCommand::BulletCommand(BulletMLParser* bp, Bullet* b)
: BulletMLRunner(bp), bullet_(b)
For example, second, third... order battery is implemented like following:
BulletCommand::BulletCommand(BulletMLState* bs, Bullet* b)
: BulletMLRunner(bs), bullet_(b)
You should call this constructor when createBullet method is called.
5. Create BulletML document
BulletMLParser* bp = new BulletMLParserTinyXML("foo.xml");
bp->build();
Because parsing BulletML is slow, all xml files should be loaded in
the initialization of the program.
6. Create first order battery
BulletCommand* bc = new BulletCommand(bp)
7. Run BulletCommand in all turn.
while (1) {
// the main loop of game
bc->run();
}
If some errors are occured, libBulletML throws BulletMLError. You can
catch this exception.
* Misc
TinyXML is used to parse XML.
http://www.gibaradunn.srac.org/tiny/index.shtml
If you cannot understand this document (yes, it's poor document and
writen in poor English), please ask me with email.
* Modified BSD License
Copyright (c) 2003, shinichiro.h All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* The name of the author may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
shinichiro.h
hamaji@nii.ac.jp
http://shinh.skr.jp/
# libBulletML
This is a C++ library to handle BulletML, the Bullet Markup Language. It's used
by Kenta Cho's games.
This is a modification of the original library available
[here](http://shinh.skr.jp/libbulletml/index_en.html).