private void DrawPolygon(Graphics g, Pen pen, Brush brush, TmxObjectPolygon tmxPolygon) { var points = TmxMath.GetPointsInMapSpace(this.tmxMap, tmxPolygon).ToArray(); g.FillPolygon(brush, points); g.DrawPolygon(pen, points); }
public static TmxObject FromXml(XElement xml, TmxObjectGroup tmxObjectGroup, TmxMap tmxMap) { Logger.WriteVerbose("Parsing object ..."); uint attributeAsUInt = TmxHelper.GetAttributeAsUInt(xml, "tid", 0u); if (attributeAsUInt != 0 && tmxMap.Templates.TryGetValue(attributeAsUInt, out TgxTemplate value)) { xml = value.Templatize(xml); tmxMap = value.TemplateGroupMap; } TmxObject tmxObject = null; if (xml.Element("ellipse") != null) { tmxObject = new TmxObjectEllipse(); } else if (xml.Element("polygon") != null) { tmxObject = new TmxObjectPolygon(); } else if (xml.Element("polyline") != null) { tmxObject = new TmxObjectPolyline(); } else if (xml.Attribute("gid") != null) { uint attributeAsUInt2 = TmxHelper.GetAttributeAsUInt(xml, "gid"); attributeAsUInt2 = TmxMath.GetTileIdWithoutFlags(attributeAsUInt2); if (tmxMap.Tiles.ContainsKey(attributeAsUInt2)) { tmxObject = new TmxObjectTile(); } else { Logger.WriteWarning("Tile Id {0} not found in tilesets. Using a rectangle instead.\n{1}", attributeAsUInt2, xml.ToString()); tmxObject = new TmxObjectRectangle(); } } else { tmxObject = new TmxObjectRectangle(); } tmxObject.Id = TmxHelper.GetAttributeAsInt(xml, "id", 0); tmxObject.Name = TmxHelper.GetAttributeAsString(xml, "name", ""); tmxObject.Type = TmxHelper.GetAttributeAsString(xml, "type", ""); tmxObject.Visible = (TmxHelper.GetAttributeAsInt(xml, "visible", 1) == 1); tmxObject.ParentObjectGroup = tmxObjectGroup; float attributeAsFloat = TmxHelper.GetAttributeAsFloat(xml, "x"); float attributeAsFloat2 = TmxHelper.GetAttributeAsFloat(xml, "y"); float attributeAsFloat3 = TmxHelper.GetAttributeAsFloat(xml, "width", 0f); float attributeAsFloat4 = TmxHelper.GetAttributeAsFloat(xml, "height", 0f); float attributeAsFloat5 = TmxHelper.GetAttributeAsFloat(xml, "rotation", 0f); tmxObject.Position = new PointF(attributeAsFloat, attributeAsFloat2); tmxObject.Size = new SizeF(attributeAsFloat3, attributeAsFloat4); tmxObject.Rotation = attributeAsFloat5; tmxObject.Properties = TmxProperties.FromXml(xml); tmxObject.InternalFromXml(xml, tmxMap); return(tmxObject); }
private void DrawPolygon(Graphics g, Pen pen, Brush brush, TmxObjectPolygon tmxPolygon) { var points = tmxPolygon.Points.ToArray(); g.FillPolygon(brush, points); g.DrawPolygon(pen, points); }
public static TmxObjectPolygon FromRectangle(TmxMap tmxMap, TmxObjectRectangle tmxRectangle) { TmxObjectPolygon tmxObjectPolygon = new TmxObjectPolygon(); TmxObject.CopyBaseProperties(tmxRectangle, tmxObjectPolygon); tmxObjectPolygon.Points = tmxRectangle.Points; return(tmxObjectPolygon); }
private XElement CreatePolygonColliderElement(TmxObjectPolygon tmxPolygon) { var points = from pt in TmxMath.GetPointsInMapSpace(this.tmxMap, tmxPolygon) select PointFToUnityVector(pt); XElement polygonCollider = new XElement("PolygonCollider2D", new XElement("Path", String.Join(" ", points.Select(pt => String.Format("{0},{1}", pt.X, pt.Y))))); return(polygonCollider); }
static public TmxObjectPolygon FromIsometricRectangle(TmxMap tmxMap, TmxObjectRectangle tmxRectangle) { Debug.Assert(tmxMap.Orientation == TmxMap.MapOrientation.Isometric); TmxObjectPolygon tmxPolygon = new TmxObjectPolygon(); TmxObject.CopyBaseProperties(tmxRectangle, tmxPolygon); tmxPolygon.Points = tmxRectangle.Points; return(tmxPolygon); }
private XElement CreatePolygonColliderElement(TmxObjectPolygon tmxPolygon) { // The points need to be transformed into unity space var points = from pt in tmxPolygon.Points select PointFToUnityVector(pt); XElement polygonCollider = new XElement("PolygonCollider2D", new XElement("Path", String.Join(" ", points.Select(pt => String.Format("{0},{1}", pt.X, pt.Y))))); return(polygonCollider); }
public static TmxObject FromXml(XElement xml, TmxObjectGroup tmxObjectGroup, TmxMap tmxMap) { Program.WriteLine("Parsing object ..."); Program.WriteVerbose(xml.ToString()); // What kind of TmxObject are we creating? TmxObject tmxObject = null; if (xml.Element("ellipse") != null) { tmxObject = new TmxObjectEllipse(); } else if (xml.Element("polygon") != null) { tmxObject = new TmxObjectPolygon(); } else if (xml.Element("polyline") != null) { tmxObject = new TmxObjectPolyline(); } else if (xml.Attribute("gid") != null) { tmxObject = new TmxObjectTile(); } else { // Just a rectangle tmxObject = new TmxObjectRectangle(); } // Data found on every object type tmxObject.Name = TmxHelper.GetAttributeAsString(xml, "name", ""); tmxObject.Type = TmxHelper.GetAttributeAsString(xml, "type", ""); tmxObject.Visible = TmxHelper.GetAttributeAsInt(xml, "visible", 1) == 1; tmxObject.ParentObjectGroup = tmxObjectGroup; float x = TmxHelper.GetAttributeAsFloat(xml, "x"); float y = TmxHelper.GetAttributeAsFloat(xml, "y"); float w = TmxHelper.GetAttributeAsFloat(xml, "width", 0); float h = TmxHelper.GetAttributeAsFloat(xml, "height", 0); float r = TmxHelper.GetAttributeAsFloat(xml, "rotation", 0); tmxObject.Position = new System.Drawing.PointF(x, y); tmxObject.Size = new System.Drawing.SizeF(w, h); tmxObject.Rotation = r; tmxObject.Properties = TmxProperties.FromXml(xml); tmxObject.InternalFromXml(xml, tmxMap); return(tmxObject); }
public static TmxObject FromXml(XElement xml, TmxObjectGroup tmxObjectGroup, TmxMap tmxMap) { Program.WriteLine("Parsing object ..."); Program.WriteVerbose(xml.ToString()); // What kind of TmxObject are we creating? TmxObject tmxObject = null; if (xml.Element("ellipse") != null) { tmxObject = new TmxObjectEllipse(); } else if (xml.Element("polygon") != null) { tmxObject = new TmxObjectPolygon(); } else if (xml.Element("polyline") != null) { tmxObject = new TmxObjectPolyline(); } else if (xml.Attribute("gid") != null) { tmxObject = new TmxObjectTile(); } else { // Just a rectangle tmxObject = new TmxObjectRectangle(); } // Data found on every object type tmxObject.Name = TmxHelper.GetAttributeAsString(xml, "name", ""); tmxObject.Type = TmxHelper.GetAttributeAsString(xml, "type", ""); tmxObject.Visible = TmxHelper.GetAttributeAsInt(xml, "visible", 1) == 1; tmxObject.ParentObjectGroup = tmxObjectGroup; float x = TmxHelper.GetAttributeAsFloat(xml, "x"); float y = TmxHelper.GetAttributeAsFloat(xml, "y"); float w = TmxHelper.GetAttributeAsFloat(xml, "width", 0); float h = TmxHelper.GetAttributeAsFloat(xml, "height", 0); float r = TmxHelper.GetAttributeAsFloat(xml, "rotation", 0); tmxObject.Position = new System.Drawing.PointF(x, y); tmxObject.Size = new System.Drawing.SizeF(w, h); tmxObject.Rotation = r; tmxObject.Properties = TmxProperties.FromXml(xml); tmxObject.InternalFromXml(xml, tmxMap); return tmxObject; }
private void FixTileColliderObjects(TmxMap tmxMap) { // Objects inside of tiles are colliders that will be merged with the colliders on neighboring tiles. // In order to promote this merging we have to perform the following clean up operations ... // - All rectangles objects are made into polygon objects // - All polygon objects will have their rotations burned into the polygon points (and Rotation set to zero) // - All cooridinates will be "sanitized" to make up for floating point errors due to rotation and poor placement of colliders // (The sanitation will round all numbers to the nearest 1/256th) // Replace rectangles with polygons for (int i = 0; i < this.ObjectGroup.Objects.Count; i++) { TmxObject tmxObject = this.ObjectGroup.Objects[i]; if (tmxObject is TmxObjectRectangle) { TmxObjectPolygon tmxObjectPolygon = TmxObjectPolygon.FromRectangle(tmxMap, tmxObject as TmxObjectRectangle); this.ObjectGroup.Objects[i] = tmxObjectPolygon; } } // Burn rotation into all polygon points, sanitizing the point locations as we go foreach (TmxObject tmxObject in this.ObjectGroup.Objects) { TmxHasPoints tmxHasPoints = tmxObject as TmxHasPoints; if (tmxHasPoints != null) { var pointfs = tmxHasPoints.Points.ToArray(); // Rotate our points by the rotation and position in the object TmxMath.RotatePoints(pointfs, tmxObject); // Sanitize our points to make up for floating point precision errors pointfs = pointfs.Select(TmxMath.Sanitize).ToArray(); // Set the points back into the object tmxHasPoints.Points = pointfs.ToList(); // Zero out our rotation tmxObject.BakeRotation(); } } }
private void FixTileColliderObjects(TmxMap tmxMap) { for (int i = 0; i < ObjectGroup.Objects.Count; i++) { TmxObject tmxObject = ObjectGroup.Objects[i]; if (tmxObject is TmxObjectRectangle) { TmxObjectPolygon value = TmxObjectPolygon.FromRectangle(tmxMap, tmxObject as TmxObjectRectangle); ObjectGroup.Objects[i] = value; } } foreach (TmxObject @object in ObjectGroup.Objects) { TmxHasPoints tmxHasPoints = @object as TmxHasPoints; if (tmxHasPoints != null) { PointF[] array = tmxHasPoints.Points.ToArray(); TmxMath.RotatePoints(array, @object); array = array.Select(TmxMath.Sanitize).ToArray(); tmxHasPoints.Points = array.ToList(); @object.BakeRotation(); } } }
private XElement CreatePolygonColliderElement(TmxObjectPolygon tmxPolygon) { var points = from pt in TmxMath.GetPointsInMapSpace(this.tmxMap, tmxPolygon) select PointFToUnityVector(pt); XElement polygonCollider = new XElement("PolygonCollider2D", new XElement("Path", String.Join(" ", points.Select(pt => String.Format("{0},{1}", pt.X, pt.Y))))); return polygonCollider; }
private List <XElement> CreateObjectElementList(TmxObjectGroup objectGroup) { List <XElement> elements = new List <XElement>(); foreach (TmxObject tmxObject in objectGroup.Objects) { // All the objects/colliders in our object group need to be separate game objects because they can have unique tags/layers XElement xmlObject = new XElement("GameObject", new XAttribute("name", tmxObject.GetNonEmptyName())); // Transform object locaction into map space (needed for isometric and hex modes) PointF xfPosition = TmxMath.ObjectPointFToMapSpace(this.tmxMap, tmxObject.Position); PointF pos = PointFToUnityVector(xfPosition); xmlObject.SetAttributeValue("x", pos.X); xmlObject.SetAttributeValue("y", pos.Y); xmlObject.SetAttributeValue("rotation", tmxObject.Rotation); AssignUnityProperties(tmxObject, xmlObject, PrefabContext.Object); AssignTiledProperties(tmxObject, xmlObject); // If we're not using a unity:layer override and there is an Object Type to go with this object then use it if (String.IsNullOrEmpty(objectGroup.UnityLayerOverrideName)) { xmlObject.SetAttributeValue("layer", tmxObject.Type); } XElement objElement = null; if (tmxObject.GetType() == typeof(TmxObjectRectangle)) { if (this.tmxMap.Orientation == TmxMap.MapOrientation.Isometric) { TmxObjectPolygon tmxIsometricRectangle = TmxObjectPolygon.FromRectangle(this.tmxMap, tmxObject as TmxObjectRectangle); objElement = CreatePolygonColliderElement(tmxIsometricRectangle); } else { objElement = CreateBoxColliderElement(tmxObject as TmxObjectRectangle); } } else if (tmxObject.GetType() == typeof(TmxObjectEllipse)) { objElement = CreateCircleColliderElement(tmxObject as TmxObjectEllipse, objectGroup.Name); } else if (tmxObject.GetType() == typeof(TmxObjectPolygon)) { objElement = CreatePolygonColliderElement(tmxObject as TmxObjectPolygon); } else if (tmxObject.GetType() == typeof(TmxObjectPolyline)) { objElement = CreateEdgeColliderElement(tmxObject as TmxObjectPolyline); } else if (tmxObject.GetType() == typeof(TmxObjectTile)) { TmxObjectTile tmxObjectTile = tmxObject as TmxObjectTile; // Apply z-cooridnate for use with the depth buffer // (Again, this is complicated by the fact that object tiles position is WRT the bottom edge of a tile) if (Tiled2Unity.Settings.DepthBufferEnabled) { float mapLogicalHeight = this.tmxMap.MapSizeInPixels().Height; float tileLogicalHeight = this.tmxMap.TileHeight; float logicalPos_y = (-pos.Y / Tiled2Unity.Settings.Scale) - tileLogicalHeight; float depth_z = CalculateFaceDepth(logicalPos_y, mapLogicalHeight); xmlObject.SetAttributeValue("z", depth_z); } AddTileObjectElements(tmxObject as TmxObjectTile, xmlObject); } else { Logger.WriteLine("Object '{0}' has been added for use with custom importers", tmxObject); } if (objElement != null) { xmlObject.Add(objElement); } elements.Add(xmlObject); } return(elements); }
private List <XElement> CreateObjectElementList(TmxObjectGroup objectGroup) { List <XElement> elements = new List <XElement>(); foreach (TmxObject tmxObject in objectGroup.Objects) { // All the objects/colliders in our object group need to be separate game objects because they can have unique tags/layers XElement xmlObject = new XElement("GameObject", new XAttribute("name", tmxObject.GetNonEmptyName())); // Transform object locaction into map space (needed for isometric and hex modes) PointF xfPosition = TmxMath.ObjectPointFToMapSpace(this.tmxMap, tmxObject.Position); PointF pos = PointFToUnityVector(xfPosition); xmlObject.SetAttributeValue("x", pos.X); xmlObject.SetAttributeValue("y", pos.Y); xmlObject.SetAttributeValue("rotation", tmxObject.Rotation); AssignUnityProperties(tmxObject, xmlObject, PrefabContext.Object); AssignTiledProperties(tmxObject, xmlObject); // If we're not using a unity:layer override and there is an Object Type to go with this object then use it if (String.IsNullOrEmpty(objectGroup.UnityLayerOverrideName)) { // why would we /ever/ do this, christ //xmlObject.SetAttributeValue("layer", tmxObject.Type); } XElement objElement = null; XElement objComponent = new XElement("TmxObjectComponent", new XAttribute("tmx-object-id", tmxObject.Id), new XAttribute("tmx-object-name", tmxObject.Name), new XAttribute("tmx-object-type", tmxObject.Type), new XAttribute("tmx-object-x", tmxObject.Position.X), new XAttribute("tmx-object-y", tmxObject.Position.Y), new XAttribute("tmx-object-width", tmxObject.Size.Width), new XAttribute("tmx-object-height", tmxObject.Size.Height), new XAttribute("tmx-object-rotation", tmxObject.Rotation)); // Do not create colliders if the are being ignored. (Still want to creat the game object though) bool ignoringCollisions = (objectGroup.Ignore == TmxLayerNode.IgnoreSettings.Collision); if (!ignoringCollisions && tmxObject.GetType() == typeof(TmxObjectRectangle)) { if (this.tmxMap.Orientation == TmxMap.MapOrientation.Isometric) { TmxObjectPolygon tmxIsometricRectangle = TmxObjectPolygon.FromRectangle(this.tmxMap, tmxObject as TmxObjectRectangle); objElement = CreatePolygonColliderElement(tmxIsometricRectangle); } else { objElement = CreateBoxColliderElement(tmxObject as TmxObjectRectangle); } // Set object component type objComponent.Name = "RectangleObjectComponent"; } else if (!ignoringCollisions && tmxObject.GetType() == typeof(TmxObjectEllipse)) { objElement = CreateCircleColliderElement(tmxObject as TmxObjectEllipse, objectGroup.Name); // Set the component type objComponent.Name = "CircleObjectComponent"; } else if (!ignoringCollisions && tmxObject.GetType() == typeof(TmxObjectPolygon)) { objElement = CreatePolygonColliderElement(tmxObject as TmxObjectPolygon); // Set the component type objComponent.Name = "PolygonObjectComponent"; } else if (!ignoringCollisions && tmxObject.GetType() == typeof(TmxObjectPolyline)) { objElement = CreateEdgeColliderElement(tmxObject as TmxObjectPolyline); // Set the component type objComponent.Name = "PolylineObjectComponent"; } else if (tmxObject.GetType() == typeof(TmxObjectTile)) { TmxObjectTile tmxObjectTile = tmxObject as TmxObjectTile; // Apply z-cooridnate for use with the depth buffer if (Tiled2Unity.Settings.DepthBufferEnabled) { float depth_z = CalculateFaceDepth(tmxObjectTile.Position.Y, tmxMap.MapSizeInPixels.Height); xmlObject.SetAttributeValue("z", depth_z); } AddTileObjectElements(tmxObjectTile, xmlObject, objComponent); } else { Logger.WriteLine("Object '{0}' has been added for use with custom importers", tmxObject); } if (objElement != null) { xmlObject.Add(objComponent); xmlObject.Add(objElement); } elements.Add(xmlObject); } return(elements); }
public static TmxObject FromXml(XElement xml, TmxObjectGroup tmxObjectGroup, TmxMap tmxMap) { Logger.WriteLine("Parsing object ..."); // What kind of TmxObject are we creating? TmxObject tmxObject = null; if (xml.Element("ellipse") != null) { tmxObject = new TmxObjectEllipse(); } else if (xml.Element("polygon") != null) { tmxObject = new TmxObjectPolygon(); } else if (xml.Element("polyline") != null) { tmxObject = new TmxObjectPolyline(); } else if (xml.Attribute("gid") != null) { uint gid = TmxHelper.GetAttributeAsUInt(xml, "gid"); gid = TmxMath.GetTileIdWithoutFlags(gid); if (tmxMap.Tiles.ContainsKey(gid)) { tmxObject = new TmxObjectTile(); } else { // For some reason, the tile is not in any of our tilesets // Warn the user and use a rectangle Logger.WriteWarning("Tile Id {0} not found in tilesets. Using a rectangle instead.\n{1}", gid, xml.ToString()); tmxObject = new TmxObjectRectangle(); } } else { // Just a rectangle tmxObject = new TmxObjectRectangle(); } // Data found on every object type tmxObject.Name = TmxHelper.GetAttributeAsString(xml, "name", ""); tmxObject.Type = TmxHelper.GetAttributeAsString(xml, "type", ""); tmxObject.Visible = TmxHelper.GetAttributeAsInt(xml, "visible", 1) == 1; tmxObject.ParentObjectGroup = tmxObjectGroup; float x = TmxHelper.GetAttributeAsFloat(xml, "x"); float y = TmxHelper.GetAttributeAsFloat(xml, "y"); float w = TmxHelper.GetAttributeAsFloat(xml, "width", 0); float h = TmxHelper.GetAttributeAsFloat(xml, "height", 0); float r = TmxHelper.GetAttributeAsFloat(xml, "rotation", 0); tmxObject.Position = new System.Drawing.PointF(x, y); tmxObject.Size = new System.Drawing.SizeF(w, h); tmxObject.Rotation = r; tmxObject.Properties = TmxProperties.FromXml(xml); tmxObject.InternalFromXml(xml, tmxMap); return(tmxObject); }
static public TmxObjectPolygon FromIsometricRectangle(TmxMap tmxMap, TmxObjectRectangle tmxRectangle) { Debug.Assert(tmxMap.Orientation == TmxMap.MapOrientation.Isometric); TmxObjectPolygon tmxPolygon = new TmxObjectPolygon(); TmxObject.CopyBaseProperties(tmxRectangle, tmxPolygon); tmxPolygon.Points = tmxRectangle.Points; return tmxPolygon; }
private List <XElement> CreateObjectElementList(TmxObjectGroup objectGroup) { List <XElement> elements = new List <XElement>(); foreach (TmxObject tmxObject in objectGroup.Objects) { // All the objects/colliders in our object group need to be separate game objects because they can have unique tags/layers XElement xmlObject = new XElement("GameObject", new XAttribute("name", tmxObject.GetNonEmptyName())); // Transform object locaction into map space (needed for isometric and hex modes) PointF xfPosition = TmxMath.ObjectPointFToMapSpace(this.tmxMap, tmxObject.Position); PointF pos = PointFToUnityVector(xfPosition); xmlObject.SetAttributeValue("x", pos.X); xmlObject.SetAttributeValue("y", pos.Y); xmlObject.SetAttributeValue("rotation", tmxObject.Rotation); AssignUnityProperties(tmxObject, xmlObject, PrefabContext.Object); AssignTiledProperties(tmxObject, xmlObject); XElement objElement = null; if (tmxObject.GetType() == typeof(TmxObjectRectangle)) { if (this.tmxMap.Orientation == TmxMap.MapOrientation.Isometric) { TmxObjectPolygon tmxIsometricRectangle = TmxObjectPolygon.FromRectangle(this.tmxMap, tmxObject as TmxObjectRectangle); objElement = CreatePolygonColliderElement(tmxIsometricRectangle); } else { objElement = CreateBoxColliderElement(tmxObject as TmxObjectRectangle); } } else if (tmxObject.GetType() == typeof(TmxObjectEllipse)) { objElement = CreateCircleColliderElement(tmxObject as TmxObjectEllipse, objectGroup.Name); } else if (tmxObject.GetType() == typeof(TmxObjectPolygon)) { objElement = CreatePolygonColliderElement(tmxObject as TmxObjectPolygon); } else if (tmxObject.GetType() == typeof(TmxObjectPolyline)) { objElement = CreateEdgeColliderElement(tmxObject as TmxObjectPolyline); } else if (tmxObject.GetType() == typeof(TmxObjectTile)) { AddTileObjectElements(tmxObject as TmxObjectTile, xmlObject); } else { Program.WriteLine("Object '{0}' has been added for use with custom importers", tmxObject); } if (objElement != null) { xmlObject.Add(objElement); } elements.Add(xmlObject); } return(elements); }
private void DrawObjectCollider(Graphics g, TmxObject tmxObject, Color color) { Color brushColor = Color.FromArgb(128, color); using (Brush brush = new HatchBrush(HatchStyle.BackwardDiagonal, color, brushColor)) using (Pen pen = new Pen(color)) { pen.Alignment = PenAlignment.Inset; GraphicsState state = g.Save(); PointF xfPosition = TmxMath.ObjectPointFToMapSpace(this.tmxMap, tmxObject.Position); g.TranslateTransform(xfPosition.X, xfPosition.Y); g.RotateTransform(tmxObject.Rotation); if (tmxObject.GetType() == typeof(TmxObjectPolygon)) { DrawPolygon(g, pen, brush, tmxObject as TmxObjectPolygon); } else if (tmxObject.GetType() == typeof(TmxObjectRectangle)) { if (this.tmxMap.Orientation == TmxMap.MapOrientation.Isometric) { TmxObjectPolygon tmxIsometricRectangle = TmxObjectPolygon.FromIsometricRectangle(this.tmxMap, tmxObject as TmxObjectRectangle); DrawPolygon(g, pen, brush, tmxIsometricRectangle); } else { // Rectangles are polygons DrawPolygon(g, pen, brush, tmxObject as TmxObjectPolygon); } } else if (tmxObject.GetType() == typeof(TmxObjectEllipse)) { DrawEllipse(g, pen, brush, tmxObject as TmxObjectEllipse); } else if (tmxObject.GetType() == typeof(TmxObjectPolyline)) { DrawPolyline(g, pen, tmxObject as TmxObjectPolyline); } else if (tmxObject.GetType() == typeof(TmxObjectTile)) { TmxObjectTile tmxObjectTile = tmxObject as TmxObjectTile; RectangleF rcTile = new RectangleF(); rcTile.X = 0; rcTile.Y = -tmxObjectTile.Tile.TileSize.Height; rcTile.Size = tmxObjectTile.Tile.TileSize; g.FillRectangle(brush, rcTile); g.DrawRectangle(pen, rcTile.X, rcTile.Y, rcTile.Width - 1, rcTile.Height - 1); } else { g.Restore(state); RectangleF bounds = tmxObject.GetWorldBounds(); g.FillRectangle(Brushes.Red, bounds.X, bounds.Y, bounds.Width, bounds.Height); g.DrawRectangle(Pens.White, bounds.X, bounds.Y, bounds.Width, bounds.Height); string message = String.Format("Unhandled object: {0}", tmxObject.GetNonEmptyName()); DrawString(g, message, bounds.X, bounds.Y); } // Restore our state g.Restore(state); } }
static public TmxObjectPolygon FromRectangle(TmxMap tmxMap, TmxObjectRectangle tmxRectangle) { TmxObjectPolygon tmxPolygon = new TmxObjectPolygon(); TmxObject.CopyBaseProperties(tmxRectangle, tmxPolygon); tmxPolygon.Points = tmxRectangle.Points; return tmxPolygon; }
private void DrawObjectCollider(Graphics g, TmxObject tmxObject, Color color) { Color brushColor = Color.FromArgb(128, color); using (Brush brush = new HatchBrush(HatchStyle.BackwardDiagonal, color, brushColor)) using (Pen pen = new Pen(color)) { pen.Alignment = PenAlignment.Inset; GraphicsState state = g.Save(); PointF xfPosition = TmxMath.ObjectPointFToMapSpace(this.tmxMap, tmxObject.Position); g.TranslateTransform(xfPosition.X, xfPosition.Y); g.RotateTransform(tmxObject.Rotation); if (tmxObject.GetType() == typeof(TmxObjectPolygon)) { DrawPolygon(g, pen, brush, tmxObject as TmxObjectPolygon); } else if (tmxObject.GetType() == typeof(TmxObjectRectangle)) { if (this.tmxMap.Orientation == TmxMap.MapOrientation.Isometric) { TmxObjectPolygon tmxIsometricRectangle = TmxObjectPolygon.FromRectangle(this.tmxMap, tmxObject as TmxObjectRectangle); DrawPolygon(g, pen, brush, tmxIsometricRectangle); } else { // Rectangles are polygons DrawPolygon(g, pen, brush, tmxObject as TmxObjectPolygon); } } else if (tmxObject.GetType() == typeof(TmxObjectEllipse)) { DrawEllipse(g, pen, brush, tmxObject as TmxObjectEllipse); } else if (tmxObject.GetType() == typeof(TmxObjectPolyline)) { DrawPolyline(g, pen, tmxObject as TmxObjectPolyline); } else if (tmxObject.GetType() == typeof(TmxObjectTile)) { GraphicsState tileState = g.Save(); TmxObjectTile tmxObjectTile = tmxObject as TmxObjectTile; // Apply scale SizeF scale = tmxObjectTile.GetTileObjectScale(); g.ScaleTransform(scale.Width, scale.Height); // Apply horizontal flip if (tmxObjectTile.FlippedHorizontal) { g.TranslateTransform(tmxObjectTile.Tile.TileSize.Width, 0); g.ScaleTransform(-1, 1); } // Apply vertical flip if (tmxObjectTile.FlippedVertical) { g.TranslateTransform(0, -tmxObjectTile.Tile.TileSize.Height); g.ScaleTransform(1, -1); } // (Note: Now we can draw the tile and collisions as normal as the transforms have been set up.) // Draw the tile Rectangle destination = new Rectangle(0, -tmxObjectTile.Tile.TileSize.Height, tmxObjectTile.Tile.TileSize.Width, tmxObjectTile.Tile.TileSize.Height); Rectangle source = new Rectangle(tmxObjectTile.Tile.LocationOnSource, tmxObjectTile.Tile.TileSize); g.DrawImage(tmxObjectTile.Tile.TmxImage.ImageBitmap, destination, source, GraphicsUnit.Pixel); // Put a black border around the tile so it sticks out a bit as an object g.DrawRectangle(Pens.Black, destination); // Draw the collisions // Make up for the fact that the bottom-left corner is the origin g.TranslateTransform(0, -tmxObjectTile.Tile.TileSize.Height); foreach (var obj in tmxObjectTile.Tile.ObjectGroup.Objects) { DrawObjectCollider(g, obj, Color.Gray); } g.Restore(tileState); } else { g.Restore(state); RectangleF bounds = tmxObject.GetWorldBounds(); g.FillRectangle(Brushes.Red, bounds.X, bounds.Y, bounds.Width, bounds.Height); g.DrawRectangle(Pens.White, bounds.X, bounds.Y, bounds.Width, bounds.Height); string message = String.Format("Unhandled object: {0}", tmxObject.GetNonEmptyName()); DrawString(g, message, bounds.X, bounds.Y); } // Restore our state g.Restore(state); } }
public static TmxObject FromXml(XElement xml, TmxObjectGroup tmxObjectGroup, TmxMap tmxMap) { Program.WriteLine("Parsing object ..."); Program.WriteVerbose(xml.ToString()); // What kind of TmxObject are we creating? TmxObject tmxObject = null; if (xml.Element("ellipse") != null) { tmxObject = new TmxObjectEllipse(); } else if (xml.Element("polygon") != null) { tmxObject = new TmxObjectPolygon(); } else if (xml.Element("polyline") != null) { tmxObject = new TmxObjectPolyline(); } else if (xml.Attribute("gid") != null) { uint gid = TmxHelper.GetAttributeAsUInt(xml, "gid"); gid = TmxMath.GetTileIdWithoutFlags(gid); if (tmxMap.Tiles.ContainsKey(gid)) { tmxObject = new TmxObjectTile(); } else { // For some reason, the tile is not in any of our tilesets // Warn the user and use a rectangle Program.WriteWarning("Tile Id {0} not found in tilesets. Using a rectangle instead.\n{1}", gid, xml.ToString()); tmxObject = new TmxObjectRectangle(); } } else { // Just a rectangle tmxObject = new TmxObjectRectangle(); } // Data found on every object type tmxObject.Name = TmxHelper.GetAttributeAsString(xml, "name", ""); tmxObject.Type = TmxHelper.GetAttributeAsString(xml, "type", ""); tmxObject.Visible = TmxHelper.GetAttributeAsInt(xml, "visible", 1) == 1; tmxObject.ParentObjectGroup = tmxObjectGroup; float x = TmxHelper.GetAttributeAsFloat(xml, "x"); float y = TmxHelper.GetAttributeAsFloat(xml, "y"); float w = TmxHelper.GetAttributeAsFloat(xml, "width", 0); float h = TmxHelper.GetAttributeAsFloat(xml, "height", 0); float r = TmxHelper.GetAttributeAsFloat(xml, "rotation", 0); tmxObject.Position = new System.Drawing.PointF(x, y); tmxObject.Size = new System.Drawing.SizeF(w, h); tmxObject.Rotation = r; tmxObject.Properties = TmxProperties.FromXml(xml); tmxObject.InternalFromXml(xml, tmxMap); return tmxObject; }