Heliodor 2018/10/27 22:31

続・ゲームデータの自動ビルドについて

前回の続きです。

生ファイルからゲームファイルを作るとき、生ファイルのタイムスタンプを調べて、異なっている場合だけ再ビルドする、という話でした。
しかし、その方法で再ビルドしてもうまくいかない場合があります。

それはファイルが「変更」ではなく「削除」されてしまった場合です。


例えば、ある生ファイルが不要になって削除された場合、そこから生成されたゲームファイルも削除しておかないといけないという事です。逆に、なんらかの手違いでゲームファイルの方を削除してしまった場合、ファイルが削除された場合、たとえ生ファイルに何の変更も無かった場合でも再ビルドしてゲームファイルをら作り直さないといけません。

結局、処理しないといけないのは次の場合についてです


A. 新しい生ファイルが追加されている(前回のビルド情報が存在しない)→ビルド
B. 生ファイルが変更されている(前回ビルド時とタイムスタンプが異なる)→再ビルド
C. 生ファイルが削除されている(前回ビルド時には存在したのに、今は無い)→対応するゲームファイルを削除
D. ゲームファイルが消えてしまった(前回のビルド時には存在したのに、今は無い)→対応する生ファイルを再ビルド


ここで気をつけないといけないのはDのパターンです。1つの生ファイルから1つのゲームファイルが出来る場合は話が簡単なのですが、1つの生ファイルから複数のゲームファイルができる場合(例: psdからレイヤごとに分解したpngを生成)、あるいは複数の生ファイルから1つのゲームファイルができる場合(例: 複数のpngを結合して一枚の大きなpngを生成)は少々ややこしいことになります。

例えば生ファイルAからゲームファイルaが、生ファイルBからゲームファイルbができる場合は、ゲームファイルaが消えているなら生ファイルAを再ビルド、ゲームファイルbが消えているなら生ファイルBを再ビルドすればいいだけです。

しかし、2つの生ファイルAとBから1つのゲームファイルcができる場合、ゲームファイルcが消えていたら生ファイルAとBの両方を再ビルドしないといけません。

逆に、1つの生ファイルAから2つのゲームファイルbとcができる場合、ゲームファイルbとcのどちらか一方でも消えていたら生ファイルAを再ビルドしないといけません。



このようなややこしい状態を解決するためには、生成関係を保存しておくようにします。例えば生ファイルAからゲームファイルaが生成される場合は、
A→a
と記録し、生ファイルBからゲームファイルbが生成されるなら
B→b
と記録します。

もし1つの生ファイルCから2つのゲームファイルdとeが生成されるなら
C→d
C→e
と記録し、逆に2つの生ファイルFとGから1つのゲームファイルhが生成されるなら
F→h
G→h
と記録します。

このようにして、生ファイルとゲームファイルの生成関係ペアを全て記録しておきます。これは生成関係の記録であると同時に、どんなゲームファイルを出力したかのリストにもなりす。このリストにあるゲームファイルが実際に存在するか確認し、消えていたら生成関係を調べ、関係する生ファイルを再ビルドすればゲームファイルを再生成できます。

例えば出力ファイルaが消えていた場合、aを含むペアを検索すると
A→a

が見つかるので、生ファイルAを再ビルドすればゲームファイルaが得られる事が分かります。同様に、出力ファイルhが消えていたならhを含むペアを検索すれば
F→h
G→h

の2つが見つかりますから、生ファイルFとGを再ビルドすれば良い事がわかります。

ちなみに、ビルド方法が複雑になって中間ファイルが必要になった場合でも同じ方法で対処できます。例えば生ファイルAとBから中間ファイルcが、中間ファイルcからゲームファイルdとeができる場合、
A→c
B→c
c→d
c→e

となるので、もしゲームファイルdが消えていたなら、dに必要なのは中間ファイルcだと分かり、中間ファイルcを生成するためには生ファイルAとBが必要だと分かります。

長くなりましたが、これでやっとビルドツールがまともに動作するようになり、データの変換という煩わしい作業を自動化する事ができました。


ちなみに、こういった「〇〇を作るためには△△が必要」みたいな情報を管理する方法は、スキルツリーやアイテム生成などの管理にも使えます。たとえば薬を得るためには薬草とお湯が必要で、お湯を得るためには水と炎か必要だとか、そういったものです。

これに関してもっとちゃんとした説明が欲しい方は、グラフ理論、有向グラフ、依存関係グラフなどで検索すると、それっぽい話がいっぱい出てきますので参考にしてみてください。


フォロワ以上ー限定特典はサンプルプログラムです。

フォロワー以上限定無料

まずは無料プランで様子見を。 お気軽にフォローしてみて下さい。

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索