Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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に埋め込むワークフロー

voidProc
たまにゲームを作っています。
https://voidproc.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした