Exemplo n.º 1
0
        /// <summary>
        /// Loads spriter information from SCML.
        /// </summary>
        public static ISpriterData LoadSCML <TData, TCharacter, TAnimation, TFrame, TKeyframe, TSprite>(this ISpriterData data, string path)
            where TData : ISpriterData
            where TCharacter : ISpriterCharacter
            where TAnimation : ISpriterAnimation
            where TFrame : ISpriterFrame
            where TKeyframe : ISpriterKeyframe
            where TSprite : ISpriterSprite
        {
            if (data == null)
            {
                data = System.Activator.CreateInstance <TData>();
            }

            using (XmlReader reader = XmlReader.Create(path))
            {
                reader.ReadToFollowing("char");

                // Create character
                ISpriterCharacter character = System.Activator.CreateInstance <TCharacter>();
                data.character = character;

                // Character name
                reader.ReadToDescendant("name");
                character.name = reader.ReadElementContentAsString();

                // Animations
                character.animations = new List <ISpriterAnimation>();

                bool doneReadingAnimations = false;

                while (!doneReadingAnimations)
                {
                    reader.Read();

                    if (reader.Name.Equals("anim"))
                    {
                        // Create animation
                        ISpriterAnimation anim = System.Activator.CreateInstance <TAnimation>();
                        character.animations.Add(anim);

                        // Animation name
                        reader.ReadToDescendant("name");
                        anim.name = reader.ReadElementContentAsString();

                        // Keyframes
                        anim.keyframes = new List <ISpriterKeyframe>();

                        while (reader.ReadToNextSibling("frame"))
                        {
                            // Create keyframe
                            ISpriterKeyframe keyframe = System.Activator.CreateInstance <TKeyframe>();
                            anim.keyframes.Add(keyframe);

                            // Keyframe name
                            reader.ReadToDescendant("name");
                            keyframe.name = reader.ReadElementContentAsString();

                            // Keyframe duration
                            reader.ReadToNextSibling("duration");
                            keyframe.duration = reader.ReadElementContentAsFloat();

                            reader.ReadEndElement();
                        }
                    }
                    else if (reader.Name.Equals("box"))
                    {
                        // Bounding box and pivot
                        float bottom, top, right, left;

                        reader.ReadToDescendant("bottom");
                        bottom = reader.ReadElementContentAsFloat();

                        reader.ReadToNextSibling("top");
                        top = reader.ReadElementContentAsFloat();

                        reader.ReadToNextSibling("right");
                        right = reader.ReadElementContentAsFloat();

                        reader.ReadToNextSibling("left");
                        left = reader.ReadElementContentAsFloat();

                        character.boundingBox = new Rect(left, top, Mathf.Abs(left) + Mathf.Abs(right), Mathf.Abs(top) + Mathf.Abs(bottom));

                        doneReadingAnimations = true;
                    }

                    reader.ReadEndElement();
                }

                bool hasFrames = reader.ReadToFollowing("frame");

                data.frames = new List <ISpriterFrame>();

                if (!hasFrames)
                {
                    return(data);
                }

                do
                {
                    // Create frame
                    ISpriterFrame frame = System.Activator.CreateInstance <TFrame>();
                    data.frames.Add(frame);

                    // Frame name
                    reader.ReadToDescendant("name");
                    frame.name = reader.ReadElementContentAsString();

                    // Frame sprites
                    frame.sprites = new List <ISpriterSprite>();

                    while (reader.ReadToNextSibling("sprite"))
                    {
                        // Create sprite
                        ISpriterSprite sprite = System.Activator.CreateInstance <TSprite>();
                        frame.sprites.Add(sprite);

                        // Image
                        reader.ReadToDescendant("image");
                        sprite.imagePath = reader.ReadElementContentAsString();

                        // Color and opacity
                        reader.ReadToNextSibling("color");
                        int rgbInt = reader.ReadElementContentAsInt();

                        float r, g, b, a;
                        r = (rgbInt & 255) / 255f;
                        g = ((rgbInt >> 8) & 255) / 255f;
                        b = ((rgbInt >> 16) & 255) / 255f;

                        reader.ReadToNextSibling("opacity");
                        a = reader.ReadElementContentAsFloat() / 100f;

                        sprite.color = new Color(r, g, b, a);

                        // Angle
                        reader.ReadToNextSibling("angle");
                        sprite.angle = reader.ReadElementContentAsFloat();

                        // X Flip
                        reader.ReadToNextSibling("xflip");
                        sprite.xFlip = System.Convert.ToBoolean(reader.ReadElementContentAsInt());

                        // Y Flip
                        reader.ReadToNextSibling("yflip");
                        sprite.yFlip = System.Convert.ToBoolean(reader.ReadElementContentAsInt());

                        // Sprite rect
                        float width, height, x, y;

                        reader.ReadToNextSibling("width");
                        width = reader.ReadElementContentAsFloat();

                        reader.ReadToNextSibling("height");
                        height = reader.ReadElementContentAsFloat();

                        reader.ReadToNextSibling("x");
                        x = reader.ReadElementContentAsFloat();

                        reader.ReadToNextSibling("y");
                        y = reader.ReadElementContentAsFloat();

                        sprite.spriteRect = new Rect(x, y, width, height);

                        reader.ReadEndElement();
                    }

                    reader.ReadEndElement();
                }while (reader.ReadToNextSibling("frame"));
            }

            return(data);
        }
Exemplo n.º 2
0
 /// <summary>
 /// Saves spriter information to SCML.
 /// </summary>
 public static ISpriterData SaveSCML <TData, TCharacter, TAnimation, TFrame, TKeyframe, TSprite>(this ISpriterData data, string path)
 {
     throw new System.NotImplementedException();
 }