シューティングゲーム作成用言語について考える。
ABAさんが弾幕XMLを作った。あれは素晴らしいシューティングゲーム作成用言語である。
一般に、言語を作る場合は言語を記述するための言語が使われる。BNFとかが有名だ。
ABAさんは言語定義言語としてRelaxerを使った。
RelaxerはXMLで言語を定義する言語だ。
しかし、XMLを書くのはややめんどくさい。
そこで、Bullet¬MLが開発された。
Bullet¬MLは、c言語的な言語でBulletMLを書く言語で、BulletMLへのトランスレータが用意されている。
http://www.notava.org/notavacc/bullet/
以下がBulletMLである。
<?xml version="1.0" ?> <!DOCTYPE bulletml SYSTEM "http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/bulletml.dtd"> <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¬MLでは以下のように書く。
action top repeat 100 action { fire direction sequence 23 bulletRef straight; wait 1; } bullet straight action { wait 20+$rand*50; changeDirection direction absolute 180 term 10; }
短くかけて素晴らしい。けど、やっぱり不満もある。
なんだか、長々書いてあってよくわからんのだ。
fire direction sequence 23 bulletRef straight;
であるけど、
<fire> <direction type="sequence">23</direction> <bulletRef label="straight" /> </fire>
こういう意味だ。
てことは、例えばこうかきたい。
fire(direction(sequence,23), bulletRef(straight));
いやいや、bulletRefは要は関数なんだから、
fire(directionSequence(23), straight());
のほうがいいんでないか?
等と考えて行くと、最終的に素晴らしい言語が出来上がるだろう。
リファレンスや、言語定義を見ると、、、。うーむ。ってなる。
さて、考えるに当たって問題が発生する。
言語定義の範囲が広すぎるのである。
俺はC言語が好きなのである。C言語みたく書きたいのである。
Haskellっぽいのは嫌なのだー。
言語の定義とサンプルがかけ離れているのである。
私はC言語の表記が好きだ。だから、できればC言語のような言語で定義したいのだ。
C言語的な言語で書けるBNFが欲しいってことだ。
なんか、BNFってHaskellとかの関数型言語に似てて嫌なのだ。
それが何なのか私は知らないけど、そういう言語があれば嬉しい。
MSが主導でDSL開発用のフレームワークみたいなのを容易したらしい。
それがもしかしたら、すばらしい言語を用意してくれるのかもしれない。
しかし、MS主導はつまらないし、なんかIDEとかでかいのがついて高く売られそうなので、
誰か、日本人の優秀な技術者がそういう環境を用意して欲しい。
私が去年考えていたCEXとかいう言語はまさに、そのような言語を目指していたのだ。
でも、XMLみたいな位置にいる言語だし、まだまだ定義は甘いのでSGMLみたいなもんか。
っていうか、XMLベースでReluxerが考えられたのだから、
C言語のような言語でReluxerが考えられてもいいよなぁと思うのだ。
で、すでに、javascriptで、lexジェネレータは作れているのだ。
てことは、えーと、C言語っぽい言語で、構文定義出来る言語作って、
yaccか何かで読めるトランスレータを作れればいいのかなと。
ごにょごにょ。
まとめ
要するに、C言語っぽい言語で言語定義言語を作って、BNFへのトランスレータ作ろうぜ。
boostのspritがいいね。
そいつ使って、BulletMLをC言語っぽい言語定義言語で再定義しようぜ。
さらに発展できたら、それ以外のシューティングゲーム作成用の言語まで定義していこうぜ。
ってことである。
で、やっぱり難しいのはC言語っぽい言語なんだわなぁ。1年かかってもちゃんとした文法も出来てない気がする。