久々に進展があったので書きました。ここ最近はCities Box.cppの開発に熱が入っており、来月中には次期アルファ版をリリースしたいと思っています。
踏切と橋の設置に対応
あれ、前からなかったっけ?と思われるかもしれませんが、それは再設計前(#11より前)のお話です。去年から始めた再設計後はまだ対応しておらず、しばらくの間は踏切や端によって道路と線路、水路を交差させることができませんでした。
この度、ようやく踏切と橋の対応できました。結構難航するのではないかと思っていましたが、再設計のおかげで割と簡単に実現できました。
再設計後はオブジェクト指向でマップ上の道路や水路、建物などの設置が成立しているので、例えば水路と道路を交差させたいときは、水路オブジェクトはそのまま、水路の上に道路オブジェクトを設置することで交差を実現しています。これにより、異なる種類のオブジェクト同士の交差で一方の変更が他方に影響する必要がなくなりました。
画面サイズの変更に対応
こちらも再設計後は対応していませんでした。というより、画面サイズの変更自体は可能でしたが、画面サイズの変化に対応させる処理を作っていませんでした。
とりあえずウィンドウの拡大には対応しており、拡大時はメニューは画面中央寄せに表示される仕様にしております。
ウィンドウの最大化も可能で、Macでは全画面表示もできます。
全画面表示についてはWindows版では別途対応が必要なので、今後実装してく予定です。
ウィンドウ縮小時はメニューのボタンの配置をウィンドウサイズに合わせるなど別途の処理が必要で、まだ対応できていません。
孤立した道路の自動除去機能
道路を引くときに、マウスカーソルの動きに沿って道路の接続などの処理を行っていますが、他のどのマスとも接続していない孤立した状態の道路や線路については、道路敷設メニューを閉じたときに自動で除去するようにしました。
このような孤立した状態の道路は、ゲーム上「工事中」という扱いになるのですが、工事中の状態のままにしておくことは設計上は想定していません。よって、想定外の状態の道路を除去することで、その後起こりうるバグの防止を実現しています。
これ以外にも、道路関係で想定していない操作が行われた際に、それらの操作を取り消すような仕組みを今後も作っていきたいと思っています。
共通オブジェクトの作成
メモリ使用量が増大してしまったので、メモリ使用量を削るべく、メモリ上には一致するオブジェクトの効率化を図りました。
具体的には、多数のタイルに共通して存在する芝生のタイルオブジェクトを各タイルに対してセーブデータに明示的に記述するのは無駄of無駄なので、これらは省略するようにし、1つのオブジェクトを共用する(「共通オブジェクト」と呼んでいる)ようにしました。
共通オブジェクトでは、オブジェクトに対する変更や削除はプログラム上で禁止することで、一部のタイルの変化が他方に影響しないようにしています。そのためタイルオブジェクトなど、タイルごとの変化が必要ない特殊なアドオンにのみ共通オブジェクトが適用されます。
OpenSiv3D v0.6.4への対応
Cities Box.cppはライブラリにOpenSiv3Dを利用しており、先日OpenSiv3D v0.6.4が公開されたため、そちらに移行しておきました。特にプログラムの変更を加えることなくスムーズに移行できました。
バグ修正等
重大なバグとして、タイル上のオブジェクトを除去するときに、for文を回して処理対象のオブジェクトをイテレータを使って切り替えようとしているにも関わらずイテレータを変化させるのを忘れているなど、かなり初歩的なミスがあったりして自分が情けなくなりました。なんで今まで問題なく動いてたんだろう…
今後の予定
まずは今残っているバグ修正を一通り進めて、完了したら次のアルファ版ver.0.2.0 (build 142)をリリースしたいと思います。その後ももちろん開発は継続し、まずはHSP3版のCities Boxにあった区画設定機能をC++版にも実装したいと思っています。
開発期間が空きがちですが、まだまだ開発を続ける気は存分にありますので、どうか今後もお付き合いください。