public static void AddShapeToShapeCollection(mapObjectgroupObject @object, ShapeCollection shapes) { //////////////////////////Early out//////////////////////////////// ///November 8th, 2015 ///Jesse Crafts-Finch ///If a polygon has a gid, and therefore an image associate with it, it will be turned into a spritesave, not a polygon. if (@object.gid != null) { return; } ////////////////////////End Early Out///////////////////////////////// Polygon polygon; AxisAlignedRectangle rectangle; Circle circle; ConvertTiledObjectToFrbShape(@object, out polygon, out rectangle, out circle); if (polygon != null) { shapes.Polygons.Add(polygon); } if (rectangle != null) { shapes.AxisAlignedRectangles.Add(rectangle); } if (circle != null) { shapes.Circles.Add(circle); } }
public static void ConvertTiledObjectToFrbShape(mapObjectgroupObject @object, out Polygon polygon, out AxisAlignedRectangle rectangle, out Circle circle) { polygon = null; rectangle = null; circle = null; if (@object.polygon != null) { foreach (mapObjectgroupObjectPolygon tiledPolygon in @object.polygon) { // TODO: Make this a rectangle object polygon = ConvertTmxObjectToFrbPolygon(@object.Name, @object.x, @object.y, @object.Rotation, tiledPolygon.points, true); polygon.Visible = tiledPolygon.Visible == 1; } } if (@object.polyline != null) { foreach (mapObjectgroupObjectPolyline polyline in @object.polyline) { polygon = ConvertTmxObjectToFrbPolygon(@object.Name, @object.x, @object.y, @object.Rotation, polyline.points, false); polygon.Visible = polyline.Visible == 1; } } if (@object.polygon == null && @object.polyline == null) { if (@object.Rotation == 0 && @object.ellipse == null) { rectangle = new AxisAlignedRectangle() { Name = @object.Name, X = (float)@object.x + (@object.width / 2), Y = (float)[email protected] - (@object.height / 2), ScaleX = @object.width / 2, ScaleY = @object.height / 2, }; rectangle.Visible = @object.Visible == 1; } else if (@object.ellipse != null && @object.width == @object.height) { circle = new Circle() { Name = @object.Name, X = (float)@object.x + (@object.width / 2), Y = (float)[email protected] - (@object.height / 2), Radius = @object.width / 2 }; circle.Visible = @object.Visible == 1; } else { polygon = ConvertTmxObjectToFrbPolygon(@object.Name, @object.x, @object.y, @object.width, @object.height, @object.Rotation, @object.ellipse); } } }
private SpriteSave CreateSpriteSaveFromObject(float scale, mapObjectgroupObject @object, int layerCount, FileReferenceType referenceType = FileReferenceType.NoDirectory) { uint gid; uint.TryParse(@object.gid, out gid); Tileset tileSet = GetTilesetForGid(gid); var sprite = new SpriteSave(); //if (!mapLayer.IsVisible && mapLayer.VisibleBehavior == LayerVisibleBehavior.Match) //{ // sprite.Visible = false; //} int imageWidth = tileSet.Images[0].width; int imageHeight = tileSet.Images[0].height; int tileWidth = tileSet.Tilewidth; int spacing = tileSet.Spacing; int tileHeight = tileSet.Tileheight; int margin = tileSet.Margin; // TODO: only calculate these once per tileset. Perhaps it can be done in the deserialize method //int tilesWide = (imageWidth - margin) / (tileWidth + spacing); //int tilesHigh = (imageHeight - margin) / (tileHeight + spacing); if (referenceType == FileReferenceType.NoDirectory) { sprite.Texture = tileSet.Images[0].sourceFileName; } else if (referenceType == FileReferenceType.Absolute) { string directory = FileManager.GetDirectory(this.FileName); if (!string.IsNullOrEmpty(tileSet.SourceDirectory) && tileSet.SourceDirectory != ".") { directory += tileSet.SourceDirectory; directory = FileManager.RemoveDotDotSlash(directory); } sprite.Texture = FileManager.RemoveDotDotSlash(directory + tileSet.Images[0].Source); } else { throw new NotImplementedException(); } uint tileTextureRelativeToStartOfTileset = (0x0fffffff & gid) - tileSet.Firstgid + 1; //if (tileSet.TileDictionary.ContainsKey(tileTextureRelativeToStartOfTileset)) //{ // var dictionary = tileSet.TileDictionary[tileTextureRelativeToStartOfTileset].PropertyDictionary; // foreach (var kvp in dictionary) // { // var key = kvp.Key; // if (IsName(key)) // { // sprite.Name = kvp.Value; // } // } //} if (string.IsNullOrEmpty(@object.Name)) { sprite.Name = "Unnamed" + gid; } else { sprite.Name = @object.Name; } SetSpriteTextureCoordinates(gid, sprite, tileSet); //CalculateWorldCoordinates(layercount, tileIndex, tileWidth, tileHeight, this.Width, out sprite.X, out sprite.Y, out sprite.Z); sprite.X = (float)@object.x; sprite.Y = -(float)@object.y; sprite.Z = layerCount; //sprite.ScaleX = tileWidth / 2.0f; //sprite.ScaleY = tileHeight / 2.0f; sprite.ScaleX = (float)@object.width / 2.0f; sprite.ScaleY = (float)@object.height / 2.0f; ///Is the tileset offset necessary for this? //if (tileSet.Tileoffset != null && tileSet.Tileoffset.Length == 1) //{ // sprite.X += tileSet.Tileoffset[0].x; // sprite.Y -= tileSet.Tileoffset[0].y; //} sprite.X *= scale; sprite.Y *= scale; // Update August 28, 2012 // The TMX converter splits // the Layers by their Z values. // We want each Layer to have its // own explicit Z value, so we don't // want to adjust the Z's when we scale: //sprite.Z *= scale; sprite.ScaleX *= scale; sprite.ScaleY *= scale; sprite.X += sprite.ScaleX; sprite.Y += sprite.ScaleY; return(sprite); }
private mapObjectgroupObject[] CreateTileMapSaveObjectGroups(IEnumerable<dynamic> objects) { var list = new List<mapObjectgroupObject>(); foreach (dynamic o in objects) { var item = new mapObjectgroupObject { x = o.X, y = o.Y }; try { item.width = o.Width; item.height = o.Height; } catch { } try { item.polygon = o.points == null ? null : ((IEnumerable<string>) o.points).Select(p => new mapObjectgroupObjectPolygon { points = p }).ToArray(); } // ReSharper disable once EmptyGeneralCatchClause catch { } try { item.polyline = o.polylines == null ? null : ((IEnumerable<string>) o.polylines).Select(pl => new mapObjectgroupObjectPolyline { points = pl }).ToArray(); } // ReSharper disable once EmptyGeneralCatchClause catch { } try { item.Rotation = o.Rotation; } // ReSharper disable once EmptyGeneralCatchClause catch { item.Rotation = 0f; } try { item.ellipse = o.Ellipse == true ? new mapObjectgroupObjectEllipse() : null; } catch { } list.Add(item); } return list.ToArray(); }