Exemplo n.º 1
0
        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")));
            }
        }
Exemplo n.º 2
0
        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);
        }