LoginSignup
7
4

More than 5 years have passed since last update.

Siv3D のファイルアーカイブ機能まとめ

Last updated at Posted at 2017-05-29

Siv3D のファイルアーカイブ機能とは

画像ファイルや音声ファイル、テキストファイルなどプログラムから使う外部データをひとつのファイルにまとめることができます。

:link: ファイルアーカイブ (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));
    }
}

:paperclips: 関連記事

:link: Siv3Dでリソースファイルをまとめてexeに埋め込むワークフロー

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4