Example #1
0
        public static TmxGroupLayer FromXml(XElement xml, TmxLayerNode parent, TmxMap tmxMap)
        {
            TmxGroupLayer tmxGroupLayer = new TmxGroupLayer(parent, tmxMap);

            tmxGroupLayer.FromXmlInternal(xml);
            return(tmxGroupLayer);
        }
Example #2
0
        private void ParseMapXml(XDocument doc)
        {
            Logger.WriteVerbose("Parsing map root ...");
            XElement xElement = doc.Element("map");

            try
            {
                Orientation         = TmxHelper.GetAttributeAsEnum <MapOrientation>(xElement, "orientation");
                StaggerAxis         = TmxHelper.GetAttributeAsEnum(xElement, "staggeraxis", MapStaggerAxis.Y);
                StaggerIndex        = TmxHelper.GetAttributeAsEnum(xElement, "staggerindex", MapStaggerIndex.Odd);
                HexSideLength       = TmxHelper.GetAttributeAsInt(xElement, "hexsidelength", 0);
                DrawOrderHorizontal = (TmxHelper.GetAttributeAsString(xElement, "renderorder", "right-down").Contains("right") ? 1 : (-1));
                DrawOrderVertical   = (TmxHelper.GetAttributeAsString(xElement, "renderorder", "right-down").Contains("down") ? 1 : (-1));
                Width           = TmxHelper.GetAttributeAsInt(xElement, "width");
                Height          = TmxHelper.GetAttributeAsInt(xElement, "height");
                TileWidth       = TmxHelper.GetAttributeAsInt(xElement, "tilewidth");
                TileHeight      = TmxHelper.GetAttributeAsInt(xElement, "tileheight");
                BackgroundColor = TmxHelper.GetAttributeAsColor(xElement, "backgroundcolor", new Color32(128, 128, 128, 255));
            }
            catch (Exception inner)
            {
                TmxException.FromAttributeException(inner, xElement);
            }
            Properties = TmxProperties.FromXml(xElement);
            IsResource = Properties.GetPropertyValueAsBoolean("unity:resource", false);
            IsResource = (IsResource || !string.IsNullOrEmpty(Properties.GetPropertyValueAsString("unity:resourcePath", null)));
            ExplicitSortingLayerName = Properties.GetPropertyValueAsString("unity:sortingLayerName", "");
            ParseAllTilesets(doc);
            ParseAllTemplates(doc);
            LayerNodes      = TmxLayerNode.ListFromXml(xElement, null, this);
            MapSizeInPixels = CalculateMapSizeInPixels();
            TmxDisplayOrderVisitor visitor = new TmxDisplayOrderVisitor();

            Visit(visitor);
        }
        public static List <TmxLayerNode> ListFromXml(XElement xmlRoot, TmxLayerNode parent, TmxMap tmxMap)
        {
            List <TmxLayerNode> nodes = new List <TmxLayerNode>();

            foreach (var xmlNode in xmlRoot.Elements())
            {
                TmxLayerNode layerNode = null;

                if (xmlNode.Name == "layer" || xmlNode.Name == "imagelayer")
                {
                    layerNode = TmxLayer.FromXml(xmlNode, parent, tmxMap);
                }
                else if (xmlNode.Name == "objectgroup")
                {
                    layerNode = TmxObjectGroup.FromXml(xmlNode, parent, tmxMap);
                }
                else if (xmlNode.Name == "group")
                {
                    layerNode = TmxGroupLayer.FromXml(xmlNode, parent, tmxMap);
                }

                // If the layer is visible then add it to our list
                if (layerNode != null && layerNode.Visible)
                {
                    nodes.Add(layerNode);
                }
            }

            return(nodes);
        }
        protected void FromXmlInternal(XElement xml)
        {
            // Get common elements amoung layer nodes from xml
            this.Name    = TmxHelper.GetAttributeAsString(xml, "name", "");
            this.Visible = TmxHelper.GetAttributeAsInt(xml, "visible", 1) == 1;
            this.Opacity = TmxHelper.GetAttributeAsFloat(xml, "opacity", 1);

            // Get the offset
            PointF offset = new PointF(0, 0);

            offset.X    = TmxHelper.GetAttributeAsFloat(xml, "offsetx", 0);
            offset.Y    = TmxHelper.GetAttributeAsFloat(xml, "offsety", 0);
            this.Offset = offset;

            // Get all the properties
            this.Properties = TmxProperties.FromXml(xml);

            // Set the "ignore" setting on this object group
            this.Ignore = this.Properties.GetPropertyValueAsEnum <IgnoreSettings>("unity:ignore", IgnoreSettings.False);

            // Explicit sorting properties
            this.ExplicitSortingLayerName = this.Properties.GetPropertyValueAsString("unity:sortingLayerName", "");
            if (this.Properties.PropertyMap.ContainsKey("unity:sortingOrder"))
            {
                this.ExplicitSortingOrder = this.Properties.GetPropertyValueAsInt("unity:sortingOrder");
            }

            // Are we using a unity:layer override?
            this.UnityLayerOverrideName = this.Properties.GetPropertyValueAsString("unity:layer", "");

            // Add all our children
            this.LayerNodes = TmxLayerNode.ListFromXml(xml, this, this.TmxMap);
        }
Example #5
0
        public static List <TmxLayerNode> ListFromXml(XElement xmlRoot, TmxLayerNode parent, TmxMap tmxMap)
        {
            List <TmxLayerNode> list = new List <TmxLayerNode>();

            foreach (XElement item in xmlRoot.Elements())
            {
                TmxLayerNode tmxLayerNode = null;
                if (item.Name == (XName)"layer" || item.Name == (XName)"imagelayer")
                {
                    tmxLayerNode = TmxLayer.FromXml(item, parent, tmxMap);
                }
                else if (item.Name == (XName)"objectgroup")
                {
                    tmxLayerNode = TmxObjectGroup.FromXml(item, parent, tmxMap);
                }
                else if (item.Name == (XName)"group")
                {
                    tmxLayerNode = TmxGroupLayer.FromXml(item, parent, tmxMap);
                }
                if (tmxLayerNode != null && tmxLayerNode.Visible && tmxLayerNode.Ignore != IgnoreSettings.True)
                {
                    list.Add(tmxLayerNode);
                }
            }
            return(list);
        }
Example #6
0
 public TmxLayer(TmxLayerNode parent, TmxMap map)
     : base(parent, map)
 {
     base.Visible    = true;
     base.Opacity    = 1f;
     Data            = new TmxData(this);
     CollisionLayers = new List <TmxLayer>();
 }
Example #7
0
 public TmxLayerNode(TmxLayerNode parent, TmxMap tmxMap)
 {
     this.DrawOrderIndex   = -1;
     this.DepthBufferIndex = -1;
     this.ParentNode       = parent;
     this.TmxMap           = tmxMap;
     this.LayerNodes       = new List <TmxLayerNode>();
 }
Example #8
0
 public TmxLayerNode(TmxLayerNode parent, TmxMap tmxMap)
 {
     DrawOrderIndex   = -1;
     DepthBufferIndex = -1;
     ParentNode       = parent;
     ParentMap        = tmxMap;
     LayerNodes       = new List <TmxLayerNode>();
 }
Example #9
0
        public static TmxGroupLayer FromXml(XElement xml, TmxLayerNode parent, TmxMap tmxMap)
        {
            Debug.Assert(xml.Name == "group");

            TmxGroupLayer tmxGroupLayer = new TmxGroupLayer(parent, tmxMap);

            tmxGroupLayer.FromXmlInternal(xml);
            return(tmxGroupLayer);
        }
Example #10
0
        public PointF GetCombinedOffset()
        {
            PointF pointF = Offset;

            for (TmxLayerNode parentNode = ParentNode; parentNode != null; parentNode = parentNode.ParentNode)
            {
                pointF = TmxMath.AddPoints(pointF, parentNode.Offset);
            }
            return(pointF);
        }
Example #11
0
        public PointF GetCombinedOffset()
        {
            PointF       offset = this.Offset;
            TmxLayerNode parent = this.ParentNode;

            while (parent != null)
            {
                offset = TmxMath.AddPoints(offset, parent.Offset);
                parent = parent.ParentNode;
            }

            return(offset);
        }
Example #12
0
        public static TmxObjectGroup FromXml(XElement xml, TmxLayerNode parent, TmxMap tmxMap)
        {
            TmxObjectGroup tmxObjectGroup = new TmxObjectGroup(parent, tmxMap);

            tmxObjectGroup.FromXmlInternal(xml);
            tmxObjectGroup.Color = TmxHelper.GetAttributeAsColor(xml, "color", new Color32(128, 128, 128, 255));
            Logger.WriteVerbose("Parsing objects in object group '{0}'", tmxObjectGroup.Name);
            IEnumerable <TmxObject> source = from obj in xml.Elements("object")
                                             select TmxObject.FromXml(obj, tmxObjectGroup, tmxMap);

            tmxObjectGroup.Objects = (from o in source
                                      orderby TmxMath.ObjectPointFToMapSpace(tmxMap, o.Position).Y
                                      select o).ToList();
            return(tmxObjectGroup);
        }
        public static float CalculateLayerDepth(TmxLayerNode layer)
        {
            if (!Tiled2Unity.Settings.DepthBufferEnabled)
            {
                return(0.0f);
            }

            float depthOfOneTile = layer.TmxMap.TileHeight / (float)layer.TmxMap.MapSizeInPixels.Height;
            float z = layer.DepthBufferIndex * depthOfOneTile * -1.0f;

            // How much is our layer offset as a function of tiles?
            float offsetRatio = layer.Offset.Y / layer.TmxMap.TileHeight;

            z -= offsetRatio * depthOfOneTile;

            return((z == -0.0f) ? 0 : z);
        }
Example #14
0
        private IEnumerable <T> RecursiveEnumerate <T>(TmxLayerNode layerNode) where T : TmxLayerNode
        {
            // Is this node the type we're looking for?
            if (layerNode.GetType() == typeof(T))
            {
                yield return((T)layerNode);
            }

            // Go through all children nodes
            foreach (var child in layerNode.LayerNodes)
            {
                foreach (var recursive in RecursiveEnumerate <T>(child))
                {
                    yield return(recursive);
                }
            }
        }
Example #15
0
        public static TmxLayer FromXml(XElement elem, TmxLayerNode parent, TmxMap tmxMap)
        {
            TmxLayer tmxLayer = new TmxLayer(parent, tmxMap);

            tmxLayer.FromXmlInternal(elem);
            if (elem.Name == (XName)"layer")
            {
                tmxLayer.ParseLayerXml(elem);
            }
            else if (elem.Name == (XName)"imagelayer")
            {
                tmxLayer.ParseImageLayerXml(elem);
            }
            tmxLayer.Meshes = TmxMesh.ListFromTmxLayer(tmxLayer);
            tmxLayer.BuildCollisionLayers();
            return(tmxLayer);
        }
Example #16
0
        private void ParseMapXml(XDocument doc)
        {
            Logger.WriteVerbose("Parsing map root ...");

            XElement map = doc.Element("map");

            try
            {
                this.Orientation         = TmxHelper.GetAttributeAsEnum <MapOrientation>(map, "orientation");
                this.StaggerAxis         = TmxHelper.GetAttributeAsEnum(map, "staggeraxis", MapStaggerAxis.Y);
                this.StaggerIndex        = TmxHelper.GetAttributeAsEnum(map, "staggerindex", MapStaggerIndex.Odd);
                this.HexSideLength       = TmxHelper.GetAttributeAsInt(map, "hexsidelength", 0);
                this.DrawOrderHorizontal = TmxHelper.GetAttributeAsString(map, "renderorder", "right-down").Contains("right") ? 1 : -1;
                this.DrawOrderVertical   = TmxHelper.GetAttributeAsString(map, "renderorder", "right-down").Contains("down") ? 1 : -1;
                this.Width           = TmxHelper.GetAttributeAsInt(map, "width");
                this.Height          = TmxHelper.GetAttributeAsInt(map, "height");
                this.TileWidth       = TmxHelper.GetAttributeAsInt(map, "tilewidth");
                this.TileHeight      = TmxHelper.GetAttributeAsInt(map, "tileheight");
                this.BackgroundColor = TmxHelper.GetAttributeAsColor(map, "backgroundcolor", Color.FromArgb(128, 128, 128));
            }
            catch (Exception e)
            {
                TmxException.FromAttributeException(e, map);
            }

            // Collect our map properties
            this.Properties = TmxProperties.FromXml(map);

            // Check properties for us being a resource
            this.IsResource = this.Properties.GetPropertyValueAsBoolean("unity:resource", false);
            this.IsResource = this.IsResource || !String.IsNullOrEmpty(this.Properties.GetPropertyValueAsString("unity:resourcePath", null));

            ParseAllTilesets(doc);

            // Get all our child layer nodes
            this.LayerNodes = TmxLayerNode.ListFromXml(map, null, this);

            // Calcuate the size of the map. Isometric and hex maps make this more complicated than a simple width and height thing.
            this.MapSizeInPixels = CalculateMapSizeInPixels();

            // Visit each node in the map to assign display order
            TmxDisplayOrderVisitor visitor = new TmxDisplayOrderVisitor();

            this.Visit(visitor);
        }
Example #17
0
 private IEnumerable <T> EnumerateLayersByType <T>() where T : TmxLayerNode
 {
     List <TmxLayerNode> .Enumerator enumerator = LayerNodes.GetEnumerator();
     try
     {
         while (enumerator.MoveNext())
         {
             TmxLayerNode current = enumerator.Current;
             foreach (T item in RecursiveEnumerate <T>(current))
             {
                 yield return(item);
             }
         }
     }
     finally
     {
         ((IDisposable)enumerator).Dispose();
     }
     enumerator = default(List <TmxLayerNode> .Enumerator);
 }
        public static TmxObjectGroup FromXml(XElement xml, TmxLayerNode parent, TmxMap tmxMap)
        {
            Debug.Assert(xml.Name == "objectgroup");

            TmxObjectGroup tmxObjectGroup = new TmxObjectGroup(parent, tmxMap);

            tmxObjectGroup.FromXmlInternal(xml);

            // Color is specific to object group
            tmxObjectGroup.Color = TmxHelper.GetAttributeAsColor(xml, "color", Color.FromArgb(128, 128, 128));

            // Get all the objects
            Logger.WriteVerbose("Parsing objects in object group '{0}'", tmxObjectGroup.Name);
            var objects = from obj in xml.Elements("object")
                          select TmxObject.FromXml(obj, tmxObjectGroup, tmxMap);

            // The objects are ordered "visually" by Y position
            tmxObjectGroup.Objects = objects.ToList();

            return(tmxObjectGroup);
        }
        private void AddLayerNodeToElement(TmxLayerNode node, XElement xml)
        {
            // Bail if the node is invisible
            if (node.Visible == false)
            {
                return;
            }

            // What type of node are we dealing with?
            if (node is TmxGroupLayer)
            {
                AddGroupLayerToElement(node as TmxGroupLayer, xml);
            }
            else if (node is TmxLayer)
            {
                AddTileLayerToElement(node as TmxLayer, xml);
            }
            else if (node is TmxObjectGroup)
            {
                AddObjectLayerToElement(node as TmxObjectGroup, xml);
            }
        }
Example #20
0
        private void AddLayerNodeToElement(TmxLayerNode node, XElement xml)
        {
            // Bail if the node is invisible
            if (node.Visible == false)
            {
                return;
            }

            xml.SetAttributeValue("sortingOrder", node.GetSortingOrder());

            // What type of node are we dealing with?
            if (node is TmxGroupLayer)
            {
                AddGroupLayerToElement(node as TmxGroupLayer, xml);
            }
            else if (node is TmxLayer)
            {
                AddTileLayerToElement(node as TmxLayer, xml);
            }
            else if (node is TmxObjectGroup)
            {
                AddObjectLayerToElement(node as TmxObjectGroup, xml);
            }
        }
Example #21
0
 private IEnumerable <T> RecursiveEnumerate <T>(TmxLayerNode layerNode) where T : TmxLayerNode
 {
     if (layerNode.GetType() == typeof(T))
     {
         yield return((T)layerNode);
     }
     List <TmxLayerNode> .Enumerator enumerator = layerNode.LayerNodes.GetEnumerator();
     try
     {
         while (enumerator.MoveNext())
         {
             TmxLayerNode current = enumerator.Current;
             foreach (T item in RecursiveEnumerate <T>(current))
             {
                 yield return(item);
             }
         }
     }
     finally
     {
         ((IDisposable)enumerator).Dispose();
     }
     enumerator = default(List <TmxLayerNode> .Enumerator);
 }
Example #22
0
        public static TmxLayer FromXml(XElement elem, TmxLayerNode parent, TmxMap tmxMap)
        {
            TmxLayer tmxLayer = new TmxLayer(parent, tmxMap);

            tmxLayer.FromXmlInternal(elem);

            // We can build a layer from a "tile layer" (default) or an "image layer"
            if (elem.Name == "layer")
            {
                tmxLayer.Width  = TmxHelper.GetAttributeAsInt(elem, "width");
                tmxLayer.Height = TmxHelper.GetAttributeAsInt(elem, "height");
                tmxLayer.ParseData(elem.Element("data"));
            }
            else if (elem.Name == "imagelayer")
            {
                XElement xmlImage = elem.Element("image");
                if (xmlImage == null)
                {
                    Logger.WriteWarning("Image Layer '{0}' is being ignored since it has no image.", tmxLayer.Name);
                    tmxLayer.Ignore = IgnoreSettings.True;
                    return(tmxLayer);
                }

                // An image layer is sort of like an tile layer but with just one tile
                tmxLayer.Width  = 1;
                tmxLayer.Height = 1;

                // Find the "tile" that matches our image
                string  imagePath = TmxHelper.GetAttributeAsFullPath(elem.Element("image"), "source");
                TmxTile tile      = tmxMap.Tiles.First(t => t.Value.TmxImage.AbsolutePath == imagePath).Value;
                tmxLayer.TileIds = new uint[1] {
                    tile.GlobalId
                };

                // The image layer needs to be tranlated in an interesting way when expressed as a tile layer
                PointF translated = tmxLayer.Offset;

                // Make up for height of a regular tile in the map
                translated.Y -= (float)tmxMap.TileHeight;

                // Make up for the height of this image
                translated.Y += (float)tile.TmxImage.Size.Height;

                // Correct for any orientation effects on the map (like isometric)
                // (We essentially undo the translation via orientation here)
                PointF orientation = TmxMath.TileCornerInScreenCoordinates(tmxMap, 0, 0);
                translated.X -= orientation.X;
                translated.Y -= orientation.Y;

                // Translate by the x and y coordiantes
                translated.X   += TmxHelper.GetAttributeAsFloat(elem, "x", 0);
                translated.Y   += TmxHelper.GetAttributeAsFloat(elem, "y", 0);
                tmxLayer.Offset = translated;
            }

            // Sometimes TMX files have "dead" tiles in them (tiles that were removed but are still referenced)
            // Remove these tiles from the layer by replacing them with zero
            for (int t = 0; t < tmxLayer.TileIds.Length; ++t)
            {
                uint tileId = tmxLayer.TileIds[t];
                tileId = TmxMath.GetTileIdWithoutFlags(tileId);
                if (!tmxMap.Tiles.ContainsKey(tileId))
                {
                    tmxLayer.TileIds[t] = 0;
                }
            }

            // Each layer will be broken down into "meshes" which are collections of tiles matching the same texture or animation
            tmxLayer.Meshes = TmxMesh.ListFromTmxLayer(tmxLayer);

            // Each layer may contain different collision types which are themselves put into "Collison Layers" to be processed later
            tmxLayer.BuildCollisionLayers();

            return(tmxLayer);
        }
Example #23
0
 public TmxLayer(TmxLayerNode parent, TmxMap map) : base(parent, map)
 {
     this.Visible         = true;
     this.Opacity         = 1.0f;
     this.CollisionLayers = new List <TmxLayer>();
 }
Example #24
0
 public TmxGroupLayer(TmxLayerNode parent, TmxMap tmxMap)
     : base(parent, tmxMap)
 {
 }
Example #25
0
 public TmxObjectGroup(TmxLayerNode parent, TmxMap tmxMap)
     : base(parent, tmxMap)
 {
     Objects = new List <TmxObject>();
 }