public void Load(string file, GraphicsDevice graphicsDevice) { int width = -1; int height = -1; int tilesize = -1; List <TiledObjectGroup> objectGroups = new List <TiledObjectGroup>(); List <MapLayer> layers = new List <MapLayer>(); TileSetManager ts = new TileSetManager(); hope = new LightRenderer(graphicsDevice, this); using (XmlReader xr = XmlReader.Create(file)) { while (xr.Read()) { if (xr.NodeType == XmlNodeType.EndElement) { continue; } switch (xr.Name) { case "tileset": using (StringReader sr = new StringReader(xr.ReadOuterXml())) using (XmlReader r = XmlReader.Create(sr)) ts.LoadTileSet(file, r, graphicsDevice); break; case "layer": MapLayer layer = null; string name = xr["name"]; using (StringReader sr = new StringReader(xr.ReadOuterXml())) using (XmlReader r = XmlReader.Create(sr)) layer = MapLayer.Load(r, graphicsDevice, ts, System.IO.Path.GetDirectoryName(file)); if (!name.StartsWith("Light")) { layers.Add(layer); } else { hope.AddLayer(layer); } break; case "map": width = int.Parse(xr["width"]); height = int.Parse(xr["height"]); tilesize = int.Parse(xr["tilewidth"]); //should be same as tileheight break; case "objectgroup": TiledObjectGroup og = new TiledObjectGroup(xr["name"]); og.Load(xr); objectGroups.Add(og); break; default: break; } } } BasicTile.SetTileSize(tilesize); this.width = width; this.height = height; this.ObjectGroups = objectGroups.ToArray(); this.Layers = layers.ToArray(); hope.LoadTileSets(ts); nodes = new Node[width, height]; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { nodes[x, y] = new Node(new Index2(x, y)); } } for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { nodes[x, y].SetNeighbours(GetNeighbours(x, y)); } } var lightbulbs = GetGroupByName("Lights"); foreach (var lightbulb in lightbulbs.Objects) { hope.AddLight(new Light((Index2)lightbulb.Position, (short)lightbulb.Properties.GetPropertyAsInt("Strength"), 1f, lightbulb.Properties.GetPropertyAsColor("Color"))); } }
public static MapLayer Load(XmlReader xr, GraphicsDevice graphicsDevice, TileSetManager tileSets, string directory) { xr.Read(); MapLayer result = new MapLayer(); result.tileSets = tileSets; result.name = xr["name"]; result.width = int.Parse(xr["width"]); result.height = int.Parse(xr["height"]); result.animatedOrInteractiveTiles = new List <BasicTile>(); while (xr.Read()) { if (xr.Name == "data" && xr.NodeType == XmlNodeType.Element) { string[] data = xr.ReadElementContentAsString().Split(','); result.data = new int[data.Length]; for (int i = 0; i < data.Length; i++) { result.data[i] = int.Parse(data[i]); } } if (xr.Name == "properties" && xr.NodeType == XmlNodeType.Element) //Properties { using (StringReader sr = new StringReader(xr.ReadOuterXml())) using (XmlReader r = XmlReader.Create(sr)) result.properties = TiledProperties.Load(r); } if (xr.Name == "layer" && xr.NodeType == XmlNodeType.EndElement) //The End { break; } } Texture2D t = new Texture2D(graphicsDevice, result.width * BasicTile.Size, result.height * BasicTile.Size); for (int i = 0; i < result.data.Length; i++) { int x = i % result.width; int y = i / result.width; bool interactive = result.tileSets.IsInteractive(result.data[i]); bool animated = result.tileSets.IsAnimation(result.data[i]); if (animated || interactive) { TiledProperties properties = result.tileSets.GetProperties(result.data[i]); result.animatedOrInteractiveTiles.Add(BasicTile.LoadTile(interactive, animated, properties, new Index2(x, y))); continue; } Color[] data = result.tileSets.GetData(result.data[i]); if (data == null) { data = new Color[BasicTile.Size * BasicTile.Size]; for (int j = 0; j < BasicTile.Size * BasicTile.Size; j++) { data[j] = Color.Transparent; } } t.SetData(0, new Rectangle(x * BasicTile.Size, y * BasicTile.Size, BasicTile.Size, BasicTile.Size), data, 0, data.Length); } foreach (var tiles in result.animatedOrInteractiveTiles) { if (tiles is InteractiveTile interactive) { interactive.Load(Path.Combine(directory, @".\..\TileSets", interactive.Properties.GetPropertyAsFile("AnimationFile")), graphicsDevice); } } result.Prerendered = t; //result.Prerendered.SaveAsPng(new FileStream(".\\prerendered" + result.name + ".png", FileMode.Create), result.Prerendered.Width, result.Prerendered.Height); //Console.WriteLine("prerendered" + result.name + "Saved"); return(result); }