ページ 11

素材を一つの実行ファイルの中にまとめるのって

Posted: 2014年3月17日(月) 12:48
by Himuro
どうやるんでしょうか。C言語でvisual C++ expressでゲームを作っているのですが、音声ファイルとテキストファイルが大量にあるので、開発中はプロジェクトフォルダ直下にそれらファイルを置いてるのですが、配布する際に見せないように実行ファイルと合体させて置きたいのですがそういう事はできますか。イメージとしては、ユーザーの元に行くのはexeファイルと説明書くらいで、exeファイルを実行するだけでゲームが遊べて、その中で音やテキストファイルがプログラム通り正しく機能するという感じです。

Re: 素材を一つの実行ファイルの中にまとめるのって

Posted: 2014年3月17日(月) 13:17
by softya(ソフト屋)
DXライブラリなら ツールが付属していますが、DirectXなど自分で作っているならアーカイブファイルをご自分で作ってもらうしかないです。
exeにリソースとして埋め込むことも出来ますが、無駄にexeファイルが肥大するのでオススメできません。当然実行時のメモリも増加します。

【補足】
ちなみにリソースに埋め込んだデータはツールで簡単に取り出せますので隠したことにはなりません。

Re: 素材を一つの実行ファイルの中にまとめるのって

Posted: 2014年3月17日(月) 14:17
by Himuro
LZH形式で圧縮したアーカイブファイルを作ってみたんですが、これをそのままプロジェクト直下に置いても読み込まれませんでした。全然よく分かってないのですが、アーカイブファイルを実行時に読み込むにはどうしたらいいのでしょうか。圧縮(LZH)フォルダーって書いてあるので、これそもそもファイルじゃなくてフォルダなんですかね。

Re: 素材を一つの実行ファイルの中にまとめるのって

Posted: 2014年3月17日(月) 14:30
by softya(ソフト屋)
DXライブラリを利用していないなら、ご自分でアーカイブファイルの読み込みと解凍を実装しなくてはいけません。
誰かが作った公開・配布されているアーカイブ・ライブラリを利用するのも良いと思います。
ただ、ライブラリのライセンスがGPLだとご自身のソースコードの公開義務など制限が生じますのでご注意ください。

【補足】
「Common Archivers Library: UNLHA32.DLL」
http://www.csdinc.co.jp/archiver/lib/unlha32.html

LZH系のライブラリです。

【補足の補足】
ファイルから読み込んでいた処理を全部アーカイブ処理に置き換えるので、コードの組み方次第では大変な手間になります。
それとサンプルコードが殆ど無いと思いますので、こういう事に詳しくないと大変苦労すると思います。

Re: 素材を一つの実行ファイルの中にまとめるのって

Posted: 2014年3月17日(月) 15:00
by Himuro
なるほど、大変勉強になりました。もうちょっとじっくり勉強してみようかと思います。有難うございました。

Re: 素材を一つの実行ファイルの中にまとめるのって

Posted: 2014年3月17日(月) 17:39
by ISLe
一個のファイルにまとめるだけなら、コマンドプロンプトで
copy /b a.bin+b.bin+c.bin archived.bin
とかすれば結合できます。

ファイルの先頭からの開始位置はズレるのでfseek関数等を使って読み取り開始位置を移動させてから読み込みます。

結合してしまえば、既にファイル名を必要としません。
各データに対するファイル先頭からのオフセット値を結合ファイルの先頭に付加しておけば連番でアクセスできます。

圧縮したいときは結合する前に個々のファイルを圧縮します。
zlibを使えばふつうにファイルから読み込むのと同じように使えます。
ライセンスもとても緩いです。
検索すれば解説サイトがたくさん見付かります。

オフトピック
実行ファイルにリソースを付加しても最初に読み込まれるのは実行に必要なコードだけなのでは。