• Home
  • About
    • 게임 개발자 유정룡 photo

      게임 개발자 유정룡

      포트폴리오

    • Learn More
    • Email
    • Github
    • Bitbucket
  • Projects
    • All Projects
    • All Tags

DirectX11 공부 13일차(XML)

14 Jun 2021

Reading time ~1 minute

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 데이터 매니저 클래스를 만들어야 편할거 같다.



DirectX Share Tweet +1