Siv3D のファイルアーカイブ機能とは
画像ファイルや音声ファイル、テキストファイルなどプログラムから使う外部データをひとつのファイルにまとめることができます。
ファイルアーカイブ (Siv3D/Reference-JP Wiki)
アーカイブの作成
Archive::Create() を使用します。
サンプルコード
// Example フォルダの内容をアーカイブファイル Example.s3a にまとめる
Archive::Create(L"Example", L"Example.s3a");
アーカイブ内のテキストファイルを読み込む
TextReader、CSVReader、INIReader、XMLReader を使用できます。
リファレンスによると、読み込み可能なテキストファイルのエンコーディングは以下に限られています。
テキストファイルは UTF-8 / UTF16-LE / UTF16-BE 形式をサポートしています。
サンプルコード
FileArchive archive(L"Example.s3a");
// テキストファイルを読み込む
const String text = TextReader(archive.load(L"Example/Test.txt").readAll());
// CSVファイルを読み込む
CSVReader csv(archive.load(L"Example/Test.csv"));
アーカイブ内の画像ファイルを読み込む
Image または Texture クラスのコンストラクタに load 関数の戻り値 (ArchivedFileReader) を渡します。
TextureAsset を使用する場合は、TextureAssetData::FromFileArchive() を使用します。
サンプルコード
FileArchive archive(L"Example.s3a");
// Texture を使用する場合
const Texture texture(archive.load(L"Example/Windmill.png"));
// TextureAsset を使用する場合
TextureAsset::Register(L"windmill", TextureAssetData::FromFileArchive(L"Example.s3a", L"Example/Windmill.png"));
アーカイブ内の音声ファイルを読み込む
Sound または Wave クラスのコンストラクタに load 関数の戻り値 (ArchivedFileReader) を渡します。
SoundAsset を使用する場合は、SoundAssetData::FromFileArchive() を使用します。
サンプルコード
FileArchive archive(L"Example.s3a");
// Sound を使用する場合
const Sound sound(archive.load(L"Example/Sound.mp3"));
// SoundAsset を使用する場合
SoundAsset::Register(L"snd", TextureAssetData::FromFileArchive(L"Example.s3a", L"Example/Sound.mp3"));
アーカイブ内のフォントを使用する
FontManager::Register() を使用します。
サンプルコード
FileArchive archive(L"Example.s3a");
FontManager::Register(archive.load(L"Example/YomogiFont.ttf"));
const Font font(24, L"よもぎフォント");
その他のフォーマットのファイルを読み込む
公式リファレンスより:
その他の形式は FileArchive::load() が返す ArchivedFileReader からバイナリデータを読み込む必要があります。
サンプルコード
FileArchive archive(L"Example.s3a");
ArchivedFileReader reader = archive.load(L"Example/Test.txt"); //特に意味なくバイナリ読み込みしてみる
// ファイルサイズ
Println(reader.size());
// 先頭から10バイト分読んでみる
Array<uint8> buffer(10);
reader.read(buffer.data(), 10);
for (auto c : buffer)
{
Println((wchar)i);
}
小ネタ : アーカイブ内の画像ファイルをまとめてアセット登録
サンプルコード
FileArchive archive(L"Example.s3a");
for (auto path : archive.contents())
{
if (path.endsWith(L".png") || path.endsWith(L".jpg"))
{
TextureAsset::Register(FileSystem::BaseName(path), TextureAssetData::FromFileArchive(L"Example.s3a", path));
}
}