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);
                }
            }
        }
Exemple #3
0
        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();
        }