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")); } }
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; }