Ejemplo n.º 1
0
        public static ExportResult ExportSpriteMapping(SpriteSheet spriteSheet, List <Animation> animations, string path)
        {
            if (spriteSheet.Frames.Count == 0)
            {
                return(ExportResult.Nothing);
            }

            bool spriteSheetFinalIsCopy = false;

            SpriteSheet spriteSheetFinal;

            if (Configuration.PackSpriteSheetWhenExportingSpriteMap)
            {
                SpriteSheetPacker packer = new SpriteSheetPacker();


                if (packer.PackSpriteSheet(spriteSheet, Configuration.ForcePowTwo, Configuration.ForceSquare,
                                           Configuration.Padding, true, Application.Instance.MaxTexSize.Width,
                                           Application.Instance.MaxTexSize.Height, out spriteSheetFinal))
                {
                    string spriteSheetFileName = Path.GetFileName(spriteSheetFinal.FullPath);
                    string pathToExport        = Path.GetDirectoryName(spriteSheetFinal.FullPath);

                    if (pathToExport != null && spriteSheetFileName != null)
                    {
                        spriteSheetFileName = spriteSheetFileName.Insert((spriteSheetFileName.Length - 1) - 3, "_packed");

                        pathToExport = Path.Combine(pathToExport, spriteSheetFileName);
                        spriteSheetFinal.FullPath = pathToExport;


                        spriteSheetFinalIsCopy = true;
                    }
                    else
                    {
                        return(ExportResult.Nothing);
                    }
                }
                else
                {
                    return(ExportResult.Nothing);
                }
            }
            else
            {
                spriteSheetFinal = spriteSheet;
            }

            bool noFrames = false;


            XMLWriter xmlWriter = new XMLWriter(path);

            xmlWriter.CreateDocWithRoot("SpriteMapping", "::Sprite Mapping generated by Sprite Vortex::");

            xmlWriter.OpenNewElement("Texture");
            xmlWriter.AddAttribute("Path", PathHelper.MakeRelativePath(spriteSheetFinal.FullPath, path));
            xmlWriter.AddAttribute("Name", PathHelper.GetFileName(spriteSheetFinal.FullPath));
            xmlWriter.CloseCurrentElement();


            xmlWriter.OpenNewElement("TransparentColors");


            if (!Configuration.OverwriteImageWhenTransparencyModified)
            {
                if (spriteSheet.TransparentColors.Count > 0)
                {
                    foreach (var color in spriteSheetFinal.TransparentColors)
                    {
                        xmlWriter.AddCompleteElementWithAttribute("Color", "Value", color.Argb.ToString());
                    }
                }
            }


            xmlWriter.CloseCurrentElement();

            xmlWriter.OpenNewElement("Sprites");
            foreach (SpriteSheetFrame spriteSheetFrame in spriteSheetFinal.Frames)
            {
                xmlWriter.OpenNewElement("Sprite");
                xmlWriter.AddAttribute("Name", spriteSheetFrame.TagName);
                xmlWriter.AddAttribute("Id", spriteSheetFrame.Id.ToString());

                xmlWriter.OpenNewElement("Coordinates");

                xmlWriter.AddCompleteElmentWithInnerText("X", spriteSheetFrame.X.ToString());
                xmlWriter.AddCompleteElmentWithInnerText("Y", spriteSheetFrame.Y.ToString());
                xmlWriter.AddCompleteElmentWithInnerText("Width", spriteSheetFrame.Width.ToString());
                xmlWriter.AddCompleteElmentWithInnerText("Height", spriteSheetFrame.Height.ToString());

                xmlWriter.CloseCurrentElement();

                xmlWriter.CloseCurrentElement();
            }
            xmlWriter.CloseCurrentElement();

            if (animations != null)
            {
                bool hasFrames = false;
                foreach (var animation in animations)
                {
                    if (animation.Frames.Count > 0)
                    {
                        hasFrames = true;
                        break;
                    }
                }

                if (hasFrames)
                {
                    xmlWriter.OpenNewElement("Animations");

                    foreach (var animation in animations)
                    {
                        xmlWriter.OpenNewElement("Animation");
                        xmlWriter.AddAttribute("Name", animation.Name);
                        xmlWriter.AddAttribute("FrameRate", animation.FrameRate.ToString());
                        xmlWriter.AddAttribute("Loop", animation.Loop.ToString());
                        xmlWriter.AddAttribute("PingPong", animation.PingPong.ToString());

                        xmlWriter.OpenNewElement("Frames");

                        foreach (var frame in animation.Frames)
                        {
                            xmlWriter.OpenNewElement("Frame");
                            xmlWriter.AddAttribute("SpriteId", frame.SpriteFrame.SpriteFrameId.ToString());
                            xmlWriter.AddAttribute("OriginX", frame.OriginX.ToString());
                            xmlWriter.AddAttribute("OriginY", frame.OriginY.ToString());
                            xmlWriter.AddAttribute("OffSetX", frame.OffSetX.ToString());
                            xmlWriter.AddAttribute("OffSetY", frame.OffSetY.ToString());
                            xmlWriter.AddAttribute("Duration", GlobalizationHelper.FormatNumber(frame.FrameDuration));

                            xmlWriter.CloseCurrentElement();
                        }

                        xmlWriter.CloseCurrentElement();

                        xmlWriter.CloseCurrentElement();
                    }
                }
                else
                {
                    noFrames = true;
                }
            }


            if (Configuration.PackSpriteSheetWhenExportingSpriteMap ||
                (Configuration.OverwriteImageWhenTransparencyModified && spriteSheetFinal.TransparentColors.Count > 0))
            {
                ExportSpriteSheetImage(spriteSheetFinal, spriteSheetFinal.FullPath);
            }

            xmlWriter.Save();


            if (spriteSheetFinalIsCopy)
            {
                spriteSheetFinal.Texture.Dispose();
            }


            return(noFrames ? ExportResult.ExportedOnlySpriteMap : ExportResult.ExportedAll);
        }