XML
애니메이션 데이터를 관리할 데이터이다. 이번에는 TINYXML2 을 사용했다.
그냥 제이슨 활용하면 엑셀로 읍읍….읍…
XML 구조를 알아야 데이터를 짜기 편하다.
이름과 데이터가 연결되어있고 이름으로 값을 get set을 한다.
Animation.cpp
bool Animation::SaveToFile(const std::string& path)
{
Xml::XMLDocument doc;
Xml::XMLDeclaration* decl = doc.NewDeclaration();
doc.LinkEndChild(decl);
Xml::XMLElement* root = doc.NewElement("Animation");
doc.LinkEndChild(root);
root->SetAttribute("Name", animation_name.c_str());
root->SetAttribute("Type", static_cast<uint>(repeat_type));
root->SetAttribute("SpriteTexturePath", sprite_texture_path.c_str());
root->SetAttribute("TextureSizeX", sprite_texture_size.x);
root->SetAttribute("TextureSizeY", sprite_texture_size.y);
for (const Keyframe& keyframe : keyframes)
{
Xml::XMLElement* first_element = doc.NewElement("Keyframe");
root->LinkEndChild(first_element);
first_element->SetAttribute("OffsetX", keyframe.offset.x);
first_element->SetAttribute("OffsetY", keyframe.offset.y);
first_element->SetAttribute("SizeX", keyframe.size.x);
first_element->SetAttribute("SizeY", keyframe.size.y);
first_element->SetAttribute("Time", keyframe.time);
}
return Xml::XMLError::XML_SUCCESS == doc.SaveFile(path.c_str());
}
노드를 찾고 그 안에 있는 노드를 참조하여 값을 저장한다.
이렇게 저장을 하면,
<?xml version="1.0" encoding="UTF-8"?>
<Animation Name="Idle" Type="1" SpriteTexturePath="_Assets/Texture/metalslug_marco.png" TextureSizeX="400" TextureSizeY="600">
<Keyframe OffsetX="4" OffsetY="2" SizeX="29" SizeY="38" Time="200"/>
<Keyframe OffsetX="35" OffsetY="2" SizeX="29" SizeY="38" Time="200"/>
<Keyframe OffsetX="64" OffsetY="2" SizeX="29" SizeY="38" Time="200"/>
</Animation>
이런 식으로 나온다.
이 값들을 로드 하면,
bool Animation::LoadFromFile(const std::string& path)
{
Xml::XMLDocument doc;
Xml::XMLError error = doc.LoadFile(path.c_str());
if (error != Xml::XMLError::XML_SUCCESS)
{
assert(false);
return false;
}
Xml::XMLElement* root = doc.FirstChildElement("Animation");
SetAnimationName(root->Attribute("Name"));
SetRepeatType(static_cast<RepeatType>(root->UnsignedAttribute("Type")));
SetSpriteTexturePath(root->Attribute("SpriteTexturePath"));
SetSpriteTextureSize({ root->FloatAttribute("TextureSizeX"), root->FloatAttribute("TextureSizeY") });
SetSpriteTexture(GetSpriteTexturePath());
Xml::XMLElement* first_element = root->FirstChildElement();
for (; first_element != nullptr; first_element = first_element->NextSiblingElement())
{
D3DXVECTOR2 offset(first_element->FloatAttribute("OffsetX"), first_element->FloatAttribute("OffsetY"));
D3DXVECTOR2 size(first_element->FloatAttribute("SizeX"), first_element->FloatAttribute("SizeY"));
float time = first_element->FloatAttribute("Time");
AddKeyframe(offset, size, time);
}
return true;
}
이런 식으로 불러온다.
갖고 오는데 번거로움이 있어 따로 xml 데이터 매니저 클래스를 만들어야 편할거 같다.