private void ProcessTileset(XElement xTileset) { var firstId = xTileset.GetAttributeAs <int>("firstgid"); var source = xTileset.GetAttributeAs <string>("source"); // Load the tileset and process the tiles inside var tileset = RequestAssetAtPath <SuperTileset>(source); if (tileset == null) { // Tileset is either missing or is not yet ready ReportError("Missing tileset asset: {0}", this.assetPath); } else { // Register all the tiles with the tile database for this map m_GlobalTileDatabase = new GlobalTileDatabase(); m_GlobalTileDatabase.RegisterTileset(firstId, tileset); } }
private bool ProcessTilesetElements(XElement xMap) { Assert.IsNull(m_GlobalTileDatabase); bool success = true; // Our tile database will be fed with tiles from each referenced tileset m_GlobalTileDatabase = new GlobalTileDatabase(); m_InternalTilesets = new List <SuperTileset>(); foreach (var xTileset in xMap.Elements("tileset")) { if (xTileset.Attribute("source") != null) { success = success && ProcessTilesetElementExternal(xTileset); } else { success = success && ProcessTilesetElementInternal(xTileset); } } return(success); }
private void ProcessTileObject(SuperObject superObject, XElement xObject) { Assert.IsNull(superObject.m_SuperTile); Assert.IsNotNull(GlobalTileDatabase, "Cannot process tile objects without a tileset database"); SuperTile tile = null; var tileId = new TileIdMath(superObject.m_TileId); int justTileId = tileId.JustTileId; // Are we getting the tile from a template? var template = xObject.GetAttributeAs("template", ""); if (!string.IsNullOrEmpty(template)) { var asset = Importer.RequestAssetAtPath <ObjectTemplate>(template); if (asset == null) { Importer.ReportError("Template file '{0}' was not found.", template); return; } tile = asset.m_Tile; if (tile == null) { Importer.ReportError("Missing tile '{0}' from template '{1}' on tile object '{2}'", justTileId, template, superObject.name); return; } } // Are we getting the tile from our tile database? if (tile == null) { GlobalTileDatabase.TryGetTile(justTileId, out tile); if (tile == null) { Importer.ReportError("Missing tile '{0}' on tile object '{1}'", justTileId, template, superObject.name); return; } } // Our type may come from the tile as well (this is 'Typed Tiles' in Tiled) if (string.IsNullOrEmpty(superObject.m_Type)) { superObject.m_Type = tile.m_Type; } // Construct the game objects for displaying a single tile var inversePPU = Importer.SuperImportContext.Settings.InversePPU; bool flip_h = tileId.HasHorizontalFlip; bool flip_v = tileId.HasVerticalFlip; var scale = Vector3.one; scale.x = xObject.GetAttributeAs("width", 1.0f); scale.y = xObject.GetAttributeAs("height", 1.0f); scale.x /= tile.m_Width; scale.y /= tile.m_Height; var tileOffset = new Vector3(tile.m_TileOffsetX * inversePPU, -tile.m_TileOffsetY * inversePPU); var translateCenter = new Vector3(tile.m_Width * 0.5f * inversePPU, tile.m_Height * 0.5f * inversePPU); // Our root object will contain the translation, rotation, and scale of the tile object var goTRS = superObject.gameObject; goTRS.transform.localScale = scale; // Add another object to handle tile flipping // This object will center us into the tile and perform the flips through scaling // This object also contains the tile offset in her transform var goCF = new GameObject(); goCF.name = string.Format("{0} (CF)", superObject.m_TiledName); goTRS.AddChildWithUniqueName(goCF); goCF.transform.localPosition = translateCenter + tileOffset; goCF.transform.localRotation = Quaternion.Euler(0, 0, 0); goCF.transform.localScale = new Vector3(flip_h ? -1 : 1, flip_v ? -1 : 1, 1); // Note: We may not want to put the tile "back into place" depending on our coordinate system var fromCenter = -translateCenter; // Isometric maps referece tile objects by bottom center if (SuperMap.m_Orientation == MapOrientation.Isometric) { fromCenter.x -= Importer.SuperImportContext.MakeScalar(tile.m_Width * 0.5f); } // Add another child, putting our coordinates back into the proper place var goTile = new GameObject(superObject.m_TiledName); goCF.AddChildWithUniqueName(goTile); goTile.transform.localPosition = fromCenter; goTile.transform.localRotation = Quaternion.Euler(0, 0, 0); goTile.transform.localScale = Vector3.one; if (Importer.SuperImportContext.LayerIgnoreMode != LayerIgnoreMode.Visual) { // Add the renderer var renderer = goTile.AddComponent <SpriteRenderer>(); renderer.sprite = tile.m_Sprite; renderer.color = new Color(1, 1, 1, superObject.CalculateOpacity()); Importer.AssignMaterial(renderer, m_ObjectLayer.m_TiledName); Importer.AssignSpriteSorting(renderer); // Add the animator if needed if (!tile.m_AnimationSprites.IsEmpty()) { var tileAnimator = goTile.AddComponent <TileObjectAnimator>(); tileAnimator.m_AnimationFramerate = AnimationFramerate; tileAnimator.m_AnimationSprites = tile.m_AnimationSprites; } } if (Importer.SuperImportContext.LayerIgnoreMode != LayerIgnoreMode.Collision) { // Add any colliders that were set up on the tile in the collision editor tile.AddCollidersForTileObject(goTile, Importer.SuperImportContext); } // Store a reference to our tile object superObject.m_SuperTile = tile; }