BulletML ABA Games

BulletML

BulletML ver. 0.21 (c) 長 健太(ABA."Saba")
Japanese
BulletML image

BulletMLがどんなものかを見たい方は以下へ。 (要Internet Explorer, Netscape Navigator 6)

ソースや言語の定義は以下からダウンロード。


はじめに

シューティング落日の今日この頃、皆様いかがお過ごしでしょうか。

ゲームといったらシューティングゲームを指していた時代は、今は昔も昔、大昔。 最近のシューティングゲームへの風当たりの強さといったら半端じゃありません。 コンシューマー市場ではほぼ全滅状態、かろうじてアーケード業界で細々と生き延びている惨状です。

細々ですが、最近のアーケードでのシューティングは良作ぞろいです。 かすりによるレベルアップで痛快なゲーム展開を実現した サイヴァリア、 リフレクトフォースによる新次元の稼ぎを体現した ギガウィング2、 芸術的な弾避けを楽しめる彩京系シューティングの極め ドラゴンブレイズ、 多彩を通り越して異彩を放つ敵の多種多様な攻撃が魅力 プロギアの嵐、 などなど。

しかし悲しいかな、これらの最高に楽しいシューティングも、 ゲーセンのすみにひっそりと置かれ、格闘ゲーや音ゲーに追いやられるのをおびえて待つ状態です。 いや、それどころがゲーセン自体の存続も昨今危ういです。 シューティングゲームの生命線はゆらぎまくりです。

そこでちょっと思い立ちました。

保存しなくては。

弾幕を。

シューティングゲームが消えてなくなってしまう前に、 この芸術的な弾幕の数々を保存しなくては、と。

BulletMLとは

謎の前段はあまり気にしなくてもいいです。

BulletMLは、いわゆる昨今の弾幕シューティングにおける 弾幕を定義するための言語です。以下のような特徴があります。

使い方

まず BulletMLアプレットのページ をご覧ください。 (注意: Internet ExplorerまたはNetscape Navigator 6でご覧ください。NN 4.7では動作しません。) そしてサンプルをちょいと動かしてみてください。

だいたい雰囲気はつかめましたか? 先ほどのページで右に書かれているのがBulletMLで書かれている弾幕記述です。

BulletMLの書き方を説明するため、簡単な例を書いてみましょう。 右上のプルダウンメニューからtemplateを選んでDocumentをいったんクリアし、 以下のように書いてみます。 方向はVerticalにして縦シューモードにしましょう。

<?xml version="1.0" ?>
<!DOCTYPE bulletml SYSTEM "http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/bulletml.dtd">

<bulletml xmlns="http://www.asahi-net.or.jp/~cs8k-cyu/bulletml">

<action label="top">
<fire>
<bullet/>
</fire>
</action>

</bulletml>

スタートを押すと、自分を狙った弾が飛んでくると思います。 この動作は<action label="top">と</action>の中に書いてあります。

action要素の中には弾幕発射のアクションを書きます。 この場合はfireアクション、つまり弾を1つ発射するというアクションが記述されています。

fireアクションの中では、どの弾をどの方向にどのくらいの速度で撃つか、 ということが記述できます。この例では方向と速度は省略、弾の種類も指定していません。 こうすると、デフォルトの自機を狙う弾が発射されます。

もう少しこった発射のしかたをしてみましょう。

<?xml version="1.0" ?>
<!DOCTYPE bulletml SYSTEM "http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/bulletml.dtd">

<bulletml xmlns="http://www.asahi-net.or.jp/~cs8k-cyu/bulletml">

<action label="top">
<repeat>
<times>100</times>
<action>
 <fire>
  <direction type="sequence">23</direction>
  <bullet/>
 </fire>
 <wait>1</wait>
</action>
</repeat>
</action>

</bulletml>

action要素がちょっと複雑になってます。まず最初のアクションはrepeatです。 repeatアクションは、あるアクションを複数回繰り返すときに使います。 繰り返し回数はrepeat要素の中のtimes要素で、繰り返すアクションはaction要素で 指定します。 この例では繰り返し回数は100回、繰り返すアクションは fireアクションとwaitアクションです。

fireアクションでは先ほどはなかったdirection要素が加わっています。 direction要素は弾を撃つ方向を指定します。 direction要素にはtypeが指定できます。typeは以下の3種類があります。

この場合はsequenceですので、直前に撃った方向との相対方向を指定しています。 単位は度です。この場合は直前から23度ずれた方向に弾を撃ちます。

つぎのwaitアクションは、一定時間待つアクションです。 単位はフレームで、1フレームは約1/60秒です。

ここまでが繰り返すアクションです。これで

という動作を100回繰り返す動作が定義できました。 動かしてみると、ある場所からくるくる回転しながら弾をばらまく、 いわゆる回転砲台ができました。

BulletMLでは、弾の飛び方を定義することもできます。 以下のようにしてみます

<?xml version="1.0" ?>
<!DOCTYPE bulletml SYSTEM "http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/bulletml.dtd">

<bulletml xmlns="http://www.asahi-net.or.jp/~cs8k-cyu/bulletml">

<action label="top">
<repeat>
<times>100</times>
<action>
 <fire>
  <direction type="sequence">23</direction>
  <bulletRef label="straight"/>
 </fire>
 <wait>1</wait>
</action>
</repeat>
</action>

<bullet label="straight">
<action>
 <wait>20+$rand*50</wait>
 <changeDirection>
  <direction type="absolute">180</direction>
  <term>10</term>
 </changeDirection>
</action>
</bullet>

</bulletml>

撃ち方は変わってませんが、撃つ弾の定義、bulletがbulletRefに変わっています。 bulletRefは、その後ろのlabelでラベルづけされたbulletの要素を参照します。 この例だと、action要素の下にあるstraightラベルがついたbullet要素です。

bullet要素の中をみてみましょう。bullet要素の中にもアクションが書かれています。 最初はwaitアクションです。ここでは待つフレーム数の中に数式がかかれています。 このように、数を指定するところでは、数式を用いることもできます。 使えるのは四則演算と余りを求める%、括弧、0から1の間の乱数を発生させる$rand変数 などです。この例では20から70(20+50)のフレーム数待つように書かれています。

その次はchangeDirectionアクションです。このアクションはdirection要素で 指定された方向に弾を向けます。この場合はabsolute180度ですので、真下です。 その次のterm要素は、何フレームかけて方向を曲げるかを書きます。 この場合は10フレームかけて少しずつ下方向に弾を曲げます。

スタートしてみましょう。さきほどの回転砲台の弾が途中から下方向に変わって 落ちてきます。プロギアの2ボスっぽいですね。サンプルにもプロギア2ボス 最終形態のサンプルがありますので、そちらもあわせてご覧ください。

よりくわしい説明については以下をごらんください。

ダウンロード

BulletMLのRELAX定義およびデモソフトウェアはフリーソフトウェアです。 以下からダウンロードできます。

活用事例

BulletMLの活用事例をご紹介。

謝辞

BulletMLではXMLモデルの定義に RELAX を、XMLドキュメントの操作用Javaクラスの生成に Relaxer を利用させていただいています。


ご意見、ご感想

ご意見、ご感想は、 cs8k-cyu@asahi-net.or.jp までお願いします。

ABA Gamesトップページへ