某人から相談を受けていてそういう話になったんだけど。
ゲームでステージを作るときに、一番簡単なのは各ステージを生のクラス一つにしてしまうこと。これの良い点は何でも出来ること。
他の方法としては、ステージを作るための言語を作ること。言語と言ってもいわゆるプログラミング言語ではなく、定義用のファイルフォーマット。
凝ったものでなければそんなに難しくない。例えば 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回目かなんかだった)