真 もわ爛漫

しゃーら、しゃーらしゃーら

定形的な操作をする際にはオレオレ言語を作るチャンスであるという話

某人から相談を受けていてそういう話になったんだけど。

ゲームでステージを作るときに、一番簡単なのは各ステージを生のクラス一つにしてしまうこと。これの良い点は何でも出来ること。

他の方法としては、ステージを作るための言語を作ること。言語と言ってもいわゆるプログラミング言語ではなく、定義用のファイルフォーマット。

凝ったものでなければそんなに難しくない。例えば http://mowa-net.jp/~amedama/baller/ では以下のようなファイルでステージを記述している。

SIZE: 1800, 180
INIT_POS: 20, 20
CLEAR: 1720, 0, 1800, 180
BGM: GAME_11
LIFE: 8
NECESSARY_COIN: 8
TIME: 75
OBJECT: stop, 0, always, global, 0, 80.0, 0.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 80.0, 20.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 80.0, 40.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 80.0, 60.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 80.0, 80.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 80.0, 100.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 160.0, 120.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 160.0, 140.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 160.0, 160.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 160.0, 100.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 160.0, 80.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 160.0, 60.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 240.0, 0.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 240.0, 40.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 240.0, 60.0, 0, 0, 0.0, 0, 0, 0
OBJECT: stop, 0, always, global, 0, 240.0, 80.0, 0, 0, 0.0, 0, 0, 0
...

ステージサイズが1800x180で、初期位置が(20, 20)、などなど。OBJECTは障害物のことで、stopは静止している物体。実際には追跡とか直進とか色々あり、画面外にいても「追跡」のアルゴリズムを発動させるのであればglobal、そうでなければlocalだかなんだかを指定するんだと思った。

コンパイラを作るための高価な言語を定義する必要はなくて、まぁ/etc/下に作られるコンフィグみたいな感じでデータを足すと拡張性を増すよね、というわけ。

ちなみに手では書いてなくて、専用のステージエディタが自動生成するのである。結構楽しかった (エディタ作るの3回目かなんかだった)