gpt4 book ai didi

c# - 在 XNA 中读取 spritesheet XML 文件

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:03 24 4
gpt4 key购买 nike

嘿,我已经四处寻找了一段时间,但我仍然找不到这个问题的直接答案。我有一个 XNA 游戏,其中 UI 的一部分显示了一个图标,该图标会经常更改(频率无关紧要)。我决定使用一个简单的 spritesheet maker,它输出 spritesheet 以及一个简单的 XML 文件,其中包含每个单独图标的位置。

我希望能够将 XML 文件中相应图标的 spritesheet 位置和图标大小读取到 Rectangle 中。然后我可以将其用作绘图位的源矩形。

然而,我还没有找到一个简单的解释,说明如何在不编写我自己的内容管道的情况下将 XML 文件加载到 XNA 4.0 项目中(如果可能的话,我想避免这种情况)以及一旦加载如何有效地(通常) 将数据提取到 Rectangle 变量中。

XML 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with TexturePacker http://texturepacker.com-->
<!-- $TexturePacker:SmartUpdate:748fc56befb00c22540f953093f731a7$ -->
<!--Format:
n => name of the sprite
x => sprite x pos in texture
y => sprite y pos in texture
w => sprite width (may be trimmed)
h => sprite height (may be trimmed)
oX => sprite's x-corner offset (only available if trimmed)
oY => sprite's y-corner offset (only available if trimmed)
oW => sprite's original width (only available if trimmed)
oH => sprite's original height (only available if trimmed)
r => 'y' only set if sprite is rotated
-->
<TextureAtlas imagePath="Loadout_Icons.png" width="185" height="86">
<sprite n="Charge_Down.png" x="0" y="0" w="37" h="43"/>
<sprite n="Charge_Up.png" x="37" y="0" w="37" h="43"/>
<sprite n="Damage_Down.png" x="74" y="0" w="37" h="43"/>
<sprite n="Damage_Up.png" x="111" y="0" w="37" h="43"/>
<sprite n="FireRate_Down.png" x="148" y="0" w="37" h="43"/>
<sprite n="FireRate_Up.png" x="0" y="43" w="37" h="43"/>
<sprite n="Health_Down.png" x="37" y="43" w="37" h="43"/>
<sprite n="Health_Up.png" x="74" y="43" w="37" h="43"/>
<sprite n="Speed_Down.png" x="111" y="43" w="37" h="43"/>
<sprite n="Speed_Up.png" x="148" y="43" w="37" h="43"/>
</TextureAtlas>

我也不确定如果我不制作自己的 XML 文件而搬起石头砸自己的脚,那会更容易吗?

我已经阅读了 msdn 必须提供的大部分内容,但无济于事,但非常感谢任何指向相关页面或问题的链接。提前致谢。

最佳答案

以下应该可以工作,但是,它完全未经测试:

[XmlRoot("TextureAtlas", IsNullable = false)]
public class TextureAtlasXml
{
public static TextureAtlasXml FromFile(String file)
{
using (var stream = File.OpenRead(file))
{
return FromStream(stream);
}
}

public static TextureAtlasXml FromStream(Stream stream)
{
var serializer = new XmlSerializer(typeof(TextureAtlasXml));
return (TextureAtlasXml)serializer.Deserialize(stream);
}


[XmlAttribute("imagePath")]
public String ImagePath;

[XmlAttribute("width")]
public Int32 Width;

[XmlAttribute("height")]
public Int32 Height;

[XmlElement("sprite")]
public List<SpriteXml> Sprites;
}

public class SpriteXml
{
[XmlAttribute("n")]
public String Name;

[XmlAttribute("x")]
public Int32 X;

[XmlAttribute("y")]
public Int32 Y;

[XmlAttribute("w")]
public Int32 Width;

[XmlAttribute("h")]
public Int32 Height;

public Rectangle Rectangle { get { return new Rectangle(this.X, this.Y, this.Width, this.Height); } }
}

我建议您考虑使用内容管道,因为它提供了一个很好的解决方案,但是,代码应该可以按您想要的方式工作。

关于c# - 在 XNA 中读取 spritesheet XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13341017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com