ファイルロード管理クラスを使おう
ソースコード
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倍くらい大変になります。
ちなみに、上記で紹介した書籍は本の結構な量を使いスマートポインタの仕組みについて教えてくれています。
そういう意味でも「買い」ですね。