Hatena::ブログ(Diary)

yumesoftの日記

2010-03-05

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

ソースコード

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倍くらい大変になります。

 

ちなみに、上記で紹介した書籍は本の結構な量を使いスマートポインタの仕組みについて教えてくれています。

そういう意味でも「買い」ですね。

さやえん豆さやえん豆 2010/03/06 03:17 ソースに解説やコメントを書くのはいいことだぜ
書いちゃいけないのはデータと嘘コメント

ロジックを犠牲にしても保守性や拡張性を優先させるべき
ソースは論理的な文章構成に近くするべき、ってのは経験則

TCHARさんTCHARさん 2010/03/09 05:23 配置するディレクトリによっては GetCurrentDirectoryA() がバッファに ?(0x3f) を格納してしまいます。

yumesoftyumesoft 2010/03/09 16:59 >さやえん豆さん
保守性と可読性を心がけて紹介していきたいと思います。

>TCHARさん
なるほど、ハートマークなどのSJISに変換できない文字がディレクトリに使われている場合ですね。
やはりGetCurrentDirectoryWを使うようにしていったほうが良さそうですね。
まずは注意書きを書いておきます。
ご指摘ありがとうございます。

yumesoftyumesoft 2010/03/10 18:47 プロジェクトの内容を更新し、ワイド文字を使うように変更しました。
ご指摘ありがとうございます。

oxioxi 2010/03/13 09:46 すばらしいです.
同人ゲーム家さん,しかも3Dの制作ノウハウを読めるとは!
実際に高クオリティなゲームを作った方の解説なので,安心感もありますし,
こちらゲーム作りのモチベーションも高まります.
しかもソースコードまで公開とは…恐れ入ります.

無理せず頑張ってください!応援してます!!
私もがんばって作ります(汗)

yumesoftyumesoft 2010/03/17 09:55 コメントありがとうございます。
コツコツ続けていきますので、(無保証ですが)参考にどうぞ。
ゲームを作られたら教えてくださいねー

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/yumesoft/20100305/1267786024