Единственное важное требование здесь - предоставить конструктор глубокого копирования, который хранит всю необходимую информацию (или, если это невозможно, метод для получения всей необходимой информации). Затем используйте этот ctor / метод для создания второго вектора. Что-то вроде:
class Object
{
RenderObject * m_Renderable;
int m_Health;
float3 m_Position;
Object(const Object * other) :
m_Renderable(nullptr),
m_Health(other->m_Health),
m_Position(other->m_Position)
{ };
Object * GetStorable()
{
return new Object(*this);
}
};
, чтобы сохранить «контрольные точки», вы просто делаете:
vector<vector<shared_ptr<Object>>> gCheckpoints;
vector<shared_ptr<Object>> gLevelObjects;
vector<shared_ptr<Object>> checkpoint;
std::for_each(
gLevelObjects.begin(), gLevelObjects.end(),
[&](shared_ptr<Object> obj)
{
checkpoint.push_back(obj->GetStorable());
});
gCheckpoints.push_back(checkpoint); // creates a new checkpoint
Вам нужно будет воссоздать информацию рендеринга для объектов при восстановлении контрольной точки; однако это требование для большинства систем сохранения в большинстве графических контекстов.
В зависимости от того, как настроен ваш класс Object
, вы также можете наследовать от другого класса, который состоит из только хранимых данных, и просто сохранять их и создавать из них визуализируемые при необходимости (class RenderObject : StoredObject { ... };
).
Вы можете альтернативно сериализовать объекты некоторым способом (двоичное сохранение, xml, json) и сохранить их в файл (автосохранение / быстрое сохранение / контрольная точка) или в памяти, а затем использовать обычный механизм загрузки для загрузки этого конкретного файла. .
Лучший метод зависит от того, каковы ваши планы и как настроена ваша система, но эта концепция должна обеспечить основы или дать вам отправную точку.