添加 Components 和 Scene 序列化支持

- Component: 添加 Serialize/Deserialize 虚函数
- TransformComponent: 实现 Transform 数据的序列化/反序列化
- GameObject: 实现对象序列化/反序列化
- Scene: 实现 Save/Load 方法,支持场景文件保存和加载
- 测试: 添加 Save_And_Load 和 Save_ContainsGameObjectData 测试
This commit is contained in:
2026-03-22 03:42:40 +08:00
parent a9d5a68dd6
commit 70571d11df
10 changed files with 189 additions and 15 deletions

View File

@@ -187,5 +187,48 @@ void GameObject::Destroy() {
}
}
void GameObject::Serialize(std::ostream& os) const {
os << "name=" << m_name << ";";
os << "active=" << (m_activeSelf ? "1" : "0") << ";";
os << "id=" << m_id << ";";
os << "transform=";
m_transform->Serialize(os);
os << ";";
}
void GameObject::Deserialize(std::istream& is) {
std::string token;
while (is.peek() != -1 && is.peek() != '\n' && is.peek() != '\r') {
if (is.peek() == ';') {
is.get();
if (is.peek() == ';') break;
continue;
}
char key[64];
is.get(key, 64, '=');
if (key[0] == '\0') break;
is.get();
if (strcmp(key, "name") == 0) {
std::getline(is, m_name, ';');
} else if (strcmp(key, "active") == 0) {
char val;
is.get(val);
m_activeSelf = (val == '1');
if (is.peek() == ';') is.get();
} else if (strcmp(key, "id") == 0) {
is >> m_id;
if (is.peek() == ';') is.get();
} else if (strcmp(key, "transform") == 0) {
m_transform->Deserialize(is);
if (is.peek() == ';') is.get();
} else {
std::getline(is, token, ';');
}
}
}
} // namespace Components
} // namespace XCEngine