LuaBullet について。

・説明

BulletML はそのお手軽な割に強力な記述能力が素晴しいですが、
ちょっと気合いの入ったことをやろうとすると苦労する場合があります。

で、BulletML と逆の方向の、お手軽では無いけど、
やろうと思えばなんでもできる弾幕記述言語が欲しいと思いました。
それが LuaBullet です。

さて、まず Lua について知っていると非常に良いです。
つまるところ、プログラムの中に埋め込まれることを
目的としたプログラム言語です。
http://staff.aist.go.jp/yutaka.ueno/lua/docsjp.html
まあ、私もこれを書いている段階で Lua歴 1日なんで
よくわかってませんが、なんとかなるっぽいです。

ちなみにとてもα版です。突如仕様が変わっても何の不思議もありません。

・リファレンス

標準的な Lua にできることに加えて、以下のような関数が使えます。
難しいのは fire だけです。たぶん。

* fire(speedX, speedY)

普通の弾を撃ちます。
角度と大きさで指定などという軟弱な方式では無いので、
自分で Lua 標準ライブラリの math.sin, math.cos で計算して下さい。
あと、math.sin とかは弧度法ですんで、math.pi も重要です。

* fire(speedX, speedY, funcName)

funcName は "winder" などと指定します。
この弾の挙動は winder という関数で定義されるようになります。

* fire(speedX, speedY, funcName, id)

弾に変数を持たせたい場合、最後の引数で指定できます。
この変数は関数に入る時に渡されます。
二引数以上渡したい場合は、グローバル変数なテーブルで
勝手に管理して下さい。
bosses.d/[Original]_some_curves.lua
がそういった動作のサンプルになっています。

* setPos(x, y)

弾の座標を (x, y) に移動します。

* setSpeed(speedX, speedY)

弾の速度を (speedX, speedY) にします。

* quit()

この弾の挙動を終了します。
以降、この弾がオリジナルの弾源の場合次の行動に移り、
そうで無い場合は、等速運動をするただの弾になります。

* vanish()

この弾を消します。
オリジナルの弾源には使わないで下さい。

* getRank()

ランクの値を取得します。0-1 の値をとります。

* getTurn()

この弾にターンが回って来た回数を取得します。
最初は 0 です。一秒で 60回位進むはずです。

* getX(), getY()

この弾の X, Y座標を取得します。

* getSpeedX(), getSpeedY()

この弾の X, Y速度を取得します。

* getPlayerAngle()

この弾からプレイヤーへの角度を得ます。単位は弧度法です。

* getPlayerX(), getPlayerY()

プレイヤーの X, Y 座標を得ます。

* getPlayerSpeedX(), getPlayerSpeedY()

プレイヤーの X, Y 速度を得ます。

* getMaxX(), getMaxY()

画面の端の座標値を得ます。

・チュートリアル

…をちょっと書き始めましたが面倒でやめました。
適当に bosses.d/*.lua を見て下さい。
[Daiouzyou]_round_5_boss_hakkyou.lua
が適度にわかりやすい例になっている気がします。

・TODO

* さすがにもうちょっと親切な API を増やす。
* ドキュメントをもうちょっとなんとか。
* たぶん遅い。
* CPU を殺したい放題なのはどうかと。
