今日、久々にCities Boxの開発を再開しました。久々すぎて仕組みとかデータ構造とかほとんど忘れちゃったんですが、ソースコードを見たり過去の開発日記を見たりしてなんとか思い出しました。
スクリーンショット 2022-02-19 5.52.47
前回の開発日記から半年も空いてしまいましたが、開発意欲はあるよ!というアピールも兼ねて、今日やった内容を書き残しておこうと思います。

やったこと

OpenSiv3D v0.6.3への対応

なぜ半年も開発が空いてしまったかというと、一番の原因はこれです。Cities BoxはOpenSiv3Dというライブラリを使って開発しておりますが、以前はOpenSiv3D v0.4.3を利用させていただいてました。
去年の10月にOpenSiv3D v0.6が公開され、そのときにOpenSiv3Dの仕様のうち様々な点が変更されました(なお現在の最新版はv0.6.3)。このとき仕様の変更が多かったために、これまでどおりのプログラムではコンパイルできませんでした。

つまり何が言いたいかというと、OpenSiv3D v0.4.3からOpenSiv3D v0.6.xにバージョンアップしたことで、Cities Box側のプログラムのかなり多くの箇所を修正しなければならず、修正しないとコンパイルすらできない状況でした。この修正作業が難航し、なかなか開発が進まなかったというのが、開発期間が空いてしまった主たる原因です。

Cities Boxをv0.4.3用からv0.6.3用に修正する上で必要だった主な変更点はこんな感じ。

  • マップファイルの読み込み・保存処理
  • アドオンファイルの読み込み処理
  • アイコンの読み込み処理
  • Addonクラスの名称変更

下2つの修正は大したことはありません。
「アイコンの読み込み処理」というのはテクスチャにアイコンを読み込むためのプログラムのことで、この点がOpenSiv3D v0.4.3とv0.6.3の間でちょっとした変更点がありました。
OpenSiv3D v0.4.3では

Texture(Icon([アイコンの16進数コード], [アイコンのサイズ]))

で表示できたのに対し、v0.6.3では

Texture{Icon([アイコンの16進数コード]), [アイコンのサイズ]}

このように書き換えなければなりませんでした。

「Addonクラスの名称変更」というのは、AddonクラスをCBAddonクラスに名称変更しました。元々Cities Boxではアドオンファイルの情報を格納するためのAddonクラスが存在していたのですが、OpenSiv3Dをv0.6.3にバージョンアップした際に、OpenSiv3D側にも同名のAddonという名前空間が新たに出来てしまい、名前が被ったためにコンパイルエラーが発生するという状況でした。これを回避すべく、AddonクラスをCBAddonクラスに名称変更しました。Cities Box側にもCities Box用の名前空間を作れば名称変更しなくても済んだのですが、膨大なソースコードの中で名前空間を適用するのが面倒くさいという海よりも深い理由があり、修正が楽な名称変更による回避方法で解決しました。

問題は上2つの修正点です。Cities BoxのアドオンファイルやマップファイルはJSON形式で保存しているのですが、OpenSiv3D v0.6.xではJSONの読み書き機能に大きな変更がありました。
これまではJSONファイルを読み込むときはJSONReaderクラスで、書き出すときはJSONWriterクラスで行うという仕様でした。
しかし、OpenSiv3D v0.6からは読み書き両方がJSONクラスに統合され、データ構造も大きく変化しました(というか互換性が新旧の間で全くありません)。というわけで、JSONファイルの読み書き部分をかなり書き直さなければなりませんでした。正直ここが一番大変でした。

しかし、やはりOpenSiv3Dというのは優れたライブラリでして、これ以外はほとんど変更点はありません。特に描画関連機能の命令フォーマットはほとんどv0.4.3以前と互換性がありながらも、内部処理の最適化や新機能の実装などが多数行われています。本当に有り難い限りです。

おわりに

今回やったのはv0.6.3への移植作業だけです。これだけでかなり骨が折れました。
実はまだ水路がうまく描画できないなど修正しなければならない点が残っており、まずはそこを修正していきたいと思っております。
新機能の実装はその先になると思います。まだまだ完成は程遠いですが、今回の修正でとりあえず動く状態になりましたので、今後も着実に開発を進めていきたいです。