オブジェクトをバイナリファイルに保存
ぽりばけつ  2016/02/28(Sun) 12:48
Siv3Dでゲームを作成しているのですが、セーブ&ロード機能の追加がうまくできないので質問させていただきます。

GameManager manager;//SceneManager<String, GameData>を継承

Serializer<BinaryWriter> writer(L"Tutorial-Serializer.bin");
writer(manager);
writer.getWriter().close();

Deserializer<BinaryReader> reader(L"Tutorial-Serializer.bin");
reader(manager);

このようにしてmanagerをまるごとバイナリファイルへ保存したいのですがうまくいきません。

サンプルでは
template <class Archive>
void serialize(Archive& archive)
{
archive(name, id, size);
}
と保存対象の型に定義してありましたが、オブジェクトをまるごと保存する場合どのように定義するべきなのでしょうか?
よろしくお願いします。
記事編集
Reputeless  2016/02/28(Sun) 16:29
SceneManager はシリアライズに対応していません。

シーンで共通に扱う GameData クラスをシリアライズに対応させ、シーン内でセーブ & ロードをするような実装にしてください。

# include <Siv3D.hpp>
# include <HamFramework.hpp>

struct GameData
{
int32 t = 1; // プレイ回数

bool initialized = false;

template <class Archive>
void serialize(Archive& archive)
{
archive(t);
}
};

using MyApp = SceneManager<String, GameData>;

const FilePath saveFilePath = L"Game-Save.bin";

struct Title : MyApp::Scene
{
void init() override
{
if (!m_data->initialized)
{
if (FileSystem::Exists(saveFilePath))
{
Deserializer<BinaryReader> reader(saveFilePath);

reader(*m_data);
}

m_data->initialized = true;
}
}

void update() override
{
if (Input::MouseL.clicked)
{
changeScene(L"Game", 2000);
}
}

void draw() const override
{
PutText(L"プレイ回数: {}"_fmt, m_data->t).from(50, 50);
}
};

struct Game : MyApp::Scene
{
void update() override
{
if (Input::MouseL.clicked)
{
// プレイ回数を 1 増やす
++m_data->t;

changeScene(L"Result", 2000);
}
}

void draw() const override
{
PutText(L"プレイ回数: {}"_fmt, m_data->t).from(50, 50);
}
};

struct Result : MyApp::Scene
{
void update() override
{
if (Input::MouseL.clicked)
{
Serializer<BinaryWriter> writer(saveFilePath);
writer(*m_data);

changeScene(L"Title", 2000);
}
}

void draw() const override
{
PutText(L"プレイ回数: {}"_fmt, m_data->t).from(50, 50);
}
};

void Main()
{
MyApp manager(SceneManagerOption::ShowSceneName);

manager.setFadeColor(Palette::White);

manager.add<Title>(L"Title");
manager.add<Game>(L"Game");
manager.add<Result>(L"Result");

while (System::Update())
{
if (!manager.updateAndDraw())
break;
}
}
編集
ぽりばけつ  2016/02/29(Mon) 12:34
ありがとうございます。
解決できました。
編集
件名
Re: オブジェクトをバイナリファイルに保存
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -