ファイルロード管理クラスを使おう

ソースコード

2010/03/10 内容を修正更新しました。
http://yumesoft.net/program.html

まずはファイルローダー

私は、ゲームを作る際に真っ先に作らなければならないものとして、必ずファイルローダーを挙げます。
画像を表示するにしても、文章を表示するにしても、データファイルを読み込めなければ何もできません。
 
ソースコードに文章を書くのは「ハードコード」と言って、とても良くないことです。文言を変えるたびに再コンパイルなんて面倒すぎます。デバッグの時くらいにしたいものです。
 
このファイルローダの仕組みは、私が尊敬するやねうらお氏の著書「Windowsプロフェッショナルゲームプログラミング」にて学んだものです。
やねうらお氏のブログ→ id:yaneurao
この著書は非常に役に立つテクニックが盛り沢山であり、電装天使ヴァルフォースの基礎設計の大半はこの本から得た知識で作られています。
絶版本となり一時値段が高騰しましたが、現在はAmazonのユーズドで1500円程度と手ごろな値段のようです。
是非手に入れておきましょう。
 
やねうらお氏…。「再販するくらいなら新しいの作るからちょっと待て」とおっしゃられてから大分経ちますが、いかがでしょうかw

効果

CVirtualFileLoaderクラスは、複数のフォルダを1つのフォルダのように扱うことができます。
テストコードでは

  • "archive.arc"
  • "data/master"
  • "data/patch"

の3つを1つのフォルダのように扱っています。
 
この状態で"sample.txt"を読もうとしたとします。
そうすると
"data/patch/sample.txt"があれば、それをロード。無ければ…、
"data/master/sample.txt"があれば、それをロード。無ければ…、
archive.arc内の"sample.txt"があれば、それをロード。無ければロード失敗。
という挙動をします。
 
さて、これの何が便利なのでしょうか?
キーワードは「差分」です。

パッチに便利

この機構はゲームのパッチをリリースする際にとても役に立ちます。
 
「最新のパッチに含まれているファイルを優先的に読み、パッチに含まれていないファイルについては既存のものを読む」
というのは、パッチというシステムと実にマッチしています。

アーカイブファイルは便利に扱おう

ゲームをリリースする際は、ファイル隠蔽や悪戯防止のためにファイルをアーカイブするかと思います。
 
しかし開発中、いちいちファイルを更新するたびにアーカイブファイルを生成するのは面倒です。
そこで、以下のようにします。

#ifdef _DEBUG
	loader.pushLoader(new CFileLoader, "data/");
#else
	loader.pushLoader(new CArchiveLoader("data.arc"), "");
#endif

こうすると、デバッグビルドの時は通常のフォルダを見に行き、リリースビルドの時はアーカイブを見に行くことになります。

開発中に便利

開発中、データファイルを頻繁に増やしたり上書きしたりすると思います。
そうした場合、共同開発者とファイルを同期させる必要がありますよね。
一部のファイルを上書きするたびに全部渡すのは面倒ですし、どのファイルを上書きしたのか覚えておくのも面倒です。
そこで…。

#ifdef _DEBUG
	loader.pushLoader(new CFileLoader, "data/");
	loader.pushLoader(new CFileLoader, "20100301/");
	loader.pushLoader(new CFileLoader, "20100302/");
	loader.pushLoader(new CFileLoader, "20100303/");
#else
	loader.pushLoader(new CArchiveLoader("data.arc"), "");
#endif

フォルダ分けしてしまいましょう。
CVirtualFileLoaderを使えば、実際にファイルを上書きしなくても同じ効果が得られますよね。
それに、過去のファイルをバックアップとして保持できるのもグッドです。

スマートポインタを使いましょう

std::tr1::shared_ptrというスマートポインタを利用しています。
  
スマートポインタって何?という人は、ぐぐってすぐ勉強しましょう。
C++がとてもとてもとても扱いやすくなる、魔法のポインタです。
これがないとゲーム作るのは10倍くらい大変になります。
 
ちなみに、上記で紹介した書籍は本の結構な量を使いスマートポインタの仕組みについて教えてくれています。
そういう意味でも「買い」ですね。