KDOC 28: 交通シミュレーションゲームを作る

CLOSE プロジェクトステータス

プロジェクトは終了した。

未完成で放置した。

概要

Simutransのような交通シミュレーションゲームを作成する。

導入

都市と交通に着目したゲームを作る。

Tasks

TODO 建物をエンティティ化する

建物をエンティティとして描画させる。

まずECSを導入した。

TODO ebiten UIを使う

扱いづらい方法でやっているので変える。UIというか、別の箇所にも及んでいるので大変そうだ。

  • ゲームステートによって常時描画するもの(メニュー・アイコンとか)と、動的に変わるもの(デバッグ表示)がある。
  • デバッグメニューは頻繁に文字が書き換わるわけだが、それをいい感じにやる方法がわからないな
    • 再作成すると更新できるが、メモリリークして急速に重くなっていく
    • Update()でテキストを更新するようなフックが必要
    • デバッグ表示があったのでそれにした
  • 日付を書き換える方法がわからない。ボタンはクリック時のハンドラがあるが、時間経過のハンドラはない

TODO UIまわりをECSっぽくする

UIは全部構造体のフィールドとして持っている項目を描画しているという感じ。ECSっぽくないので変える。

前のローグライクでは、コンポーネントをかなり使っていた。UI描画はスタティックメソッドで、mainから呼び出す感じ。mainにあるグローバルなゲームステートによって変わるから、systemにはなくmainから呼び出す感じか。systemだと常時実行という感じ。

TODO タイルを1次元配列にする

  • 3次元は必要ない
  • 2次元もループを回す手間がかかるので、1次元に入れる。ヘルパーを用意すれば扱いやすくなる

TODO 連続建設と単体建設を分ける

道路系は範囲建設だが、建物系は単体建設になる。

TODO バス停の詳細情報を見られるようにする

建設物の情報を保存する。

エンティティ化したあとにやる。

TODO ebitenUIを使う

オレオレUIだからあまり綺麗じゃない。

TODO オブジェクトを道路上に走らせる

つながっている道路だけ走れる。

TODO 高さについて考える

どうすればいいのか見当もつかない。

TODO つながっているを表現する(平面)

  • 経路探索ライブラリがあるので、そんなに難しくない可能性がある
  • 毎回道路に走るたびに乗り物に計算させてつながっているかは判定させればよさそう。つながっているかはベースの座標によって変わるので。

TODO つながっているを表現する(立体)

異なる高さの道路は接続できない。スロープでしかつながらない。

TODO 道路の方向を自動決定する

エンティティ化した後にやる。

設置したときに周囲8マスの状態に応じて画像を変化させる。横にあれば曲がるアイコンになるだろう。

参考

Archives

DONE ベースを作る

参考コードを元にする。不要そうなところを削除していく。

  • タイルセットを変えた

DONE 道路画像を登録する

  • 後から追加する方法がわからない
  • 描いたほうがはやそう
    • gimpで追加した

DONE ブルドーザーアイコンが消えた

タイルセットの更新を忘れていたっぽい。Tilesで保存し直したら差分が出て直った。

DONE バス停を作る

とりあえず画像は後回しにして、追加してみる。

DONE コード整理

全体ざっくり読んでみる。

DONE 自動リリース

設定する。

DONE CIチェック

ライブラリの依存関係が多いので、イメージを作成する。

DONE バス停の位置がずれている

設置時にカーソルとずれているのを直す。

建物は高さが違う。描画時に高く表示されていた。

DONE バス停を道路と重ねられるようにする

透過して重ねる。

  • TilesとTilesImage

DONE セルの大きさを統一する

今はスナップの精度が違うのでずれる。同じように建設してもずれる。

  • 道路を4マスから1マスにした。自分で建てる建物は1マスでいいだろう。

DONE タイル画像を直接触っている部分があり扱いにくい

タイル画像が平原なら〜という箇所が大量に存在する。タイル画像ではなくオブジェクトで判定したいよな。

  • 地形もオブジェクトとする(エンティティではない)
  • 建物もエンティティとする
    • Renderコンポートネントを登録して描画する
  • diggerではタイルは配列で表現されていた。2次元配列ではない。そうだ、タイルに関しては3次元でなくてよい。各座標に1つしかないのだから
  • タイルは配列にする
  • 描画エンティティが座標と高さを持つようにする

CLOSE マップと同じにできないのか

属性とマップの画像を別々に持っている。いちいちfor文で取り出している。

DONE バス停を道路上だけに建設できるようにする

tiletype分岐させることで、バス停を道路上へ建設できるようになった。

DONE デプロイする

先例があるので簡単にできそう。