SimCityっぽい感じのJavaアプリケーションです。
慶應義塾大学湘南藤沢キャンパス 2010年春学期「オブジェクト指向プログラミング」という授業の 最終課題として製作した、都市シミュレーターです。 シティセンター効果などのシミュレーションを行い、 ある程度自然な都市が生成されるようになっています。 授業で指定された学校専用ライブラリを使用しています。 ライブラリが足りずにコンパイルできないはずなので、t07013ha.jarを実行してください。
© Hiroki Akiyama http://akiroom.com/ All rights reserved.
私的な利用の範囲を超えて利用する場合は著作権者の許諾を必要とするものとします。
作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何らの責任も負わないものとします。
最終課題提出当時のレポートの一部を、Markdown記法に変更して転載します。
地味な街並みを眺めて楽しむ、「JimiCity」を開発しました。
起動してながめることが目的のゲームです。キーボードのキーを押すと、それぞれのインタラクションを楽しむことができます。
- [↑][→][↓][←]
- それぞれの方向へ画面の表示領域を移動します
- [スペース]
- シティセンターの地価を高騰させます
- [B]
- シティセンターに不況の嵐を巻き起こします
- [W]
- 標準的な街の景況へリセットします
- [R]
- 一部の地域を区画整理します
- [/]
- 街の発展アルゴリズムをシティセンター方式かランダム方式に切り換えます。
- [Q]
- 違う街へ行きます(都市をリセットします)
初めてSimCityのようなゲームを作るにあたって、最初は初代SimCityのように縦横に直角に交わるグリッド表示を考えていたのですが、どうしてもSimCity2000以降の、斜め見下ろし型の画面にしたかったので、苦戦して斜め視点の画面表示を実現しました。
ゲームらしいゲームを作った事がなく、ノウハウがまったくなかったのですが、グリッド表示を作ってから順番にずらして少しずつ試行錯誤を繰り返して、ようやく実現できました。おそらくpres2の履歴を見ていただければ試行錯誤が分かると思います。
当初の予定では直線のみの道路を自動生成しようと考えていたのですが、L字カーブやT字路を用意したいと考え、再帰処理を使って任意の点から道路を伸ばしていくことで、日本の道路にありがちな変なルートの道路をつくることができました。
最初に本システムが一段落ついた時は、ランダムに街を表示していたため高層ビルの横に一戸建て住宅があるような不自然な街並みでした。以前、SimCityでは「シティーセンター」という概念をとりいれていると聞いていたことを思い出し、街の中心地を設定してそこからどんどん低層なビルが並ぶようにプログラムを書き換えたところ、本物の街のような街並みがつくれました。起動中に[/]キーを押すことで、製作初期のランダムな街並みアルゴリズムへと切り替えることができます。
街並の1タイルごとのタイルをすべて、抽象クラスであるTileクラスから継承し、各タイルに抽象メソッドsetRandomImage()を実行することで、そのタイルがビルでも道路でも、条件分岐せずに画像をセットできるようにしました。
関数の戻り値にX,Y座標を返せるPointクラスを使いたかったのですが、チェックシートでは使用が禁止されていたため、自分でつくりました。
SimCity2000のデータを勝手に使おうかと考えたのですが、せっかく作ったプログラムを著作権の都合で公開できないのは時間が無駄になってしまうと考え、すべてのドット絵を一から新しく描きました。結果としてちょっと下手な感じのシステムになっていますが、絶対に誰も見たことが無い街をお見せすることができるので、よかったかな、と考えています。
大量の画像を動かす上、オブプロの独自仕様ライブラリでは画像のキャッシュができないようだったので、軽量化に頭を悩ませました。普段使っている潤沢なライブラリを使えず、基本中の基本をやるしかなかったのですが、結果として多少高速なシステムができたと思います。
具体的には、以下の点を工夫しました
- 縦横2倍にしたドット絵で画面サイズ中の計算量を減らす
- 1枚あたり9KBのpngファイルを使っていたが、 1枚あたり50KBぐらいあるGIFファイルに切り替えた (ファイルサイズが大きくなったがGIFファイルの方が描画が速かった)
- 再描画フラグを用意してループ中の再描画を極力減らした
- 当初は全部描き換えていたが、表示中の場所のみを再描画するようにした
制限の厳しいオブプロのライブラリのみという環境のもと、まったく開発経験のない斜め見下ろし型のゲーム画面開発という体験は、かなりハードなものでした。しかし、徐々に街ができていく感覚は、SimCityのそれとは違ったものがあり、とても楽しかったです。
心残りな点は、教育上の理由とはいえ指定以外のライブラリの使用が禁止されている点です。例えば禁止されているjava.awt.Colorや数々のGUIライブラリをそのまま使えたら本格的に応用的なゲームをつくることもできるかもしれません。実際に授業外でもつくってみようかな、と思いました。
Colorクラスについては、BCanvasクラスのdrawTextメソッドを使う際に使いたかったので、実装を探し出して継承してColorクラスのもつ数値型を取り出す部分を置き換えようとしたのですが、実装部を見つけることができず、泣く泣くdrawTextの引数にnullを指定して白色のみを使いました。