Cities Box.cpp開発日記 #12

with コメントはまだありません

前回から少し間が空いてしまいましたが開発自体は続いています。

次々に仕様変更が続いておりますので、どの時点で記事にするか迷っておりました。

 

タイル主体からオブジェクト主体へ

今まではマップ上のタイルごとにアドオン情報(タイプ、向き、住民数、幸福度など)をセーブデータに記録していました。

マップ上のオブジェクト(建物や道路)にはオブジェクト番号が割り振られ、

複数のタイルを占有するアドオンの場合(例:1×2サイズ)、オブジェクト番号をもとに識別していました。

しかしながら、これでは一つのオブジェクトが占有する範囲を調べるために周囲のタイルを走査しなければならず、

あまりにも非効率です。そしてなにより、プログラムのバグなどによって、同一のオブジェクトにも関わらず

それぞれのタイルの間で整合性が取れなくなる危険性もあります。

また、レイヤといった重ね合わせ表示機能も作成しており、

今後の拡張性のためにも、オブジェクトはオブジェクトごとに管理することが望ましいと言えます。

 

ということで、今までタイル主体でしたが、この度オブジェクト主体に変更しました。

具体的には、マップ上のあらゆる物体(建物、道路、地面etc.)をオブジェクトと捉えてすべてのオブジェクトを読み込んでおき、

それぞれのタイルにオブジェクトのポインタを保持させています。

※見た目は全く変わらない

オブジェクト主体になることで何が変わるのか?といいますと、

  • 一つのタイルの上で別々のオブジェクトの重ね合わせが可能になる 例)公園オブジェクトの上に街灯オブジェクトを自由に設置できる
  • オブジェクトの設置、削除操作が一元的に行える(今まではタイルごとに設置・削除操作を行っていた)
  • 同じオブジェクトにも関わらずタイルによって住民数が違ったりと整合性が取れなくなる危険性がなくなる
  • オブジェクトの移動操作(未実装)が容易に実装できる
  • 住民の勤務地や通学先と行った情報がオブジェクト単位で指定できるようになる
  • プログラムの効率が上がり、動作が早くなる

…とまあ良いこと尽くめです。一つデメリットを上げるとしたら、オブジェクトの情報をセーブデータに記録しなければならず、

セーブデータのサイズが1MBほど増大してしまったことでしょうか。

 

今のところ建物の設置だけ対応しており、道路の敷設機能は現在実装中です。

 

セーブデータ上の変数の調整

説明が難しいので省略しますが、開発しやすい形に調整しました。

 

カーソルアイコン修正機能

カーソルとはマウスカーソルのことです。

今までWindows版ではウィンドウの右・左・下側からウィンドウ上にマウスカーソルを移動させると、

カーソルのアイコンが「↔」のようなウィンドウのサイズ調整用のアイコンに変わり、もとに戻らないという問題がありました。

これを修正いたしました。

 

セーブデータの仕様変更

内部のデータ構造が仕様変更されたのに伴い、セーブデータの仕様を変更しました。

なお、古いセーブデータが開かれた場合は自動的に新しい形式に変換されます。

ただ、HSP版のセーブデータ(.cbd形式)はあまりにも仕様に違いがあり、一時的に非対応にしました。

正式版が出るまでにはcbdファイルからの変換機能を作っておきたいところですが、

仕様変更が次々に続いていてきりがないので、変更作業が落ち着いてからにします。

 

方向の名称の変更

今まではプログラム内部で上下左右(Top, Bottom, Left, Right)でオブジェクトの向きを示してましたが、

これを東西南北(East, West, South, North)に変更しました。

将来的な視点変更機能の実装を見越してのことです。

 

Before

After

 

市民総乳児化

たぶんHSP版のバグなんですが、セーブデータを覗いてみたところ、

全市民がバグで1歳児扱いされていることが分かりました。オギャー!

1歳児だらけの家(セーブデータより)

近いうちにHSP版を修正しておきます。

Leave a Reply