diff options
Diffstat (limited to 'MonoGameLibrary/Graphics/TextureAtlas.cs')
| -rw-r--r-- | MonoGameLibrary/Graphics/TextureAtlas.cs | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/MonoGameLibrary/Graphics/TextureAtlas.cs b/MonoGameLibrary/Graphics/TextureAtlas.cs new file mode 100644 index 0000000..751c341 --- /dev/null +++ b/MonoGameLibrary/Graphics/TextureAtlas.cs @@ -0,0 +1,89 @@ +using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.Serialization;
+using System.Xml;
+using System.Xml.Linq;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Content;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace MonoGameLibrary.Graphics;
+
+public class TextureAtlas
+{
+ private Dictionary<string, TextureRegion> _regions;
+ public Texture2D Texture { get; set; }
+
+ public TextureAtlas()
+ {
+ _regions = [];
+ }
+
+ public TextureAtlas(Texture2D texture)
+ {
+ Texture = texture;
+ _regions = [];
+ }
+
+ public void AddRegion(string name, int x, int y, int width, int height)
+ {
+ TextureRegion region = new TextureRegion(Texture, x, y, width, height);
+ _regions.Add(name, region);
+ }
+
+ public TextureRegion GetRegion(string name)
+ {
+ return _regions[name];
+ }
+
+ public bool RemoveRegion(string name)
+ {
+ return _regions.Remove(name);
+ }
+
+ public void Clear()
+ {
+ _regions.Clear();
+ }
+
+ public static TextureAtlas FromFile(ContentManager content, string fileName)
+ {
+ TextureAtlas atlas = new TextureAtlas();
+
+ string filePath = Path.Combine(content.RootDirectory, fileName);
+
+ using (Stream stream = TitleContainer.OpenStream(filePath))
+ {
+ using (XmlReader reader = XmlReader.Create(stream))
+ {
+ XDocument doc = XDocument.Load(reader);
+ XElement root = doc.Root;
+
+ string texturePath = root.Element("Texture").Value;
+ atlas.Texture = content.Load<Texture2D>(texturePath);
+
+ var regions = root.Element("Regions")?.Elements("Region");
+
+ if (regions != null)
+ {
+ foreach (var region in regions)
+ {
+ string name = region.Attribute("name")?.Value;
+ int x = int.Parse(region.Attribute("x")?.Value ?? "0");
+ int y = int.Parse(region.Attribute("y")?.Value ?? "0");
+ int width = int.Parse(region.Attribute("width")?.Value ?? "0");
+ int height = int.Parse(region.Attribute("height")?.Value ?? "0");
+
+ if (!string.IsNullOrEmpty(name))
+ {
+ atlas.AddRegion(name, x, y, width, height);
+ }
+ }
+ }
+ }
+ }
+
+ return atlas;
+ }
+}
\ No newline at end of file |
