示例#1
0
        internal TmxTileset(XElement tileset, string tmxDir = "")
        {
            var firstGid = tileset.Attribute("firstgid");
            var source = (string)tileset.Attribute("source");

            if (source != null)
            {
                // Prepend the parent TMX directory if necessary
                source = Path.Combine(tmxDir, source);

                // source is always preceded by firstgid
                this.FirstGid = (int)firstGid;

                // Everything else is in the TSX file
                var docTileset = this.ReadXml(source);
                var ts = new TmxTileset(docTileset, this.TmxDirectory);

                this.Name = ts.Name;
                this.TileWidth = ts.TileWidth;
                this.TileHeight = ts.TileHeight;
                this.Spacing = ts.Spacing;
                this.Margin = ts.Margin;
                this.TileOffset = ts.TileOffset;
                this.Image = ts.Image;
                this.Terrains = ts.Terrains;
                this.Tiles = ts.Tiles;
                this.Properties = ts.Properties;
            }
            else
            {
                // firstgid is always in TMX, but not TSX
                if (firstGid != null)
                    this.FirstGid = (int)firstGid;

                this.Name = (string)tileset.Attribute("name");
                this.TileWidth = (int)tileset.Attribute("tilewidth");
                this.TileHeight = (int)tileset.Attribute("tileheight");
                this.Spacing = (int?)tileset.Attribute("spacing") ?? 0;
                this.Margin = (int?)tileset.Attribute("margin") ?? 0;

                this.TileOffset = new TmxTileOffset(tileset.Element("tileoffset"));
                this.Image = new TmxImage(tileset.Element("image"), tmxDir);

                this.Terrains = new TmxList<TmxTerrain>();
                var terrainType = tileset.Element("terraintypes");
                if (terrainType != null)
                {
                    foreach (var e in terrainType.Elements("terrain"))
                        this.Terrains.Add(new TmxTerrain(e));
                }

                this.Tiles = new List<TmxTilesetTile>();
                foreach (var tileElement in tileset.Elements("tile"))
                {
                    var tile = new TmxTilesetTile(tileElement, this.Terrains, tmxDir);
                    this.Tiles.Add(tile);
                }

                this.Properties = new PropertyDict(tileset.Element("properties"));
            }
        }
示例#2
0
        private static TileSheet LoadTileset(TmxTileset tileset, Size tilesSize, GameResourceManager gameResourceManager)
        {
            var texturePath = Path.Combine(Path.GetDirectoryName(tileset.Image.Source), Path.GetFileNameWithoutExtension(tileset.Image.Source))
                .Remove(0, ContentFolder.Length + 1);
            //var texture = gameResourceManager.GetTexture(@"Tiled\tmw_desert_spacing");
            var texture = gameResourceManager.GetTexture(texturePath);
            //var sheet = new TileSheet(texture, "Desert", new Size(tmxMap.TileWidth, tmxMap.TileHeight));

            var sheet = gameResourceManager.GetTileSheet(tileset.Name);
            if (sheet == null)
            {
                sheet = new TileSheet(texture, tileset.Name, tilesSize);

                var margin = tileset.Margin;
                var spacing = tileset.Spacing;
                var numTileWidth = (tileset.Image.Width - (2 * margin) + spacing) / (tileset.TileWidth + spacing);
                var numTileHeight = (tileset.Image.Height - (2 * margin) + spacing) / (tileset.TileHeight + spacing);

                for (var j = 0; j < numTileHeight; j++)
                    for (var i = 0; i < numTileWidth; i++)
                        sheet.CreateTileDefinition((tileset.FirstGid + i + numTileWidth * j).ToString(),
                            new Point(margin + i * (tileset.TileWidth + spacing), margin + j * (tileset.TileHeight + spacing)));

                gameResourceManager.AddTileSheet(sheet);
            }

            return sheet;
        }