Пример #1
0
        public CharacterModel Read(XDocument input, CharacterModel model, ContentManager content, GraphicsDevice graphics)
        {
            CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

            model = new CharacterModel();
            SpriterProcessor processor = new SpriterProcessor();
            // pitäs lukea xml:stä yhen filun koko helevetti
            SpriterShadowData data = processor.Process(input, content, graphics);
            Dictionary <int, Dictionary <int, Vector2> > l_defaultPivot = new Dictionary <int, Dictionary <int, Vector2> >();

            foreach (XElement l_folder in data.XML.Root.Descendants("folder"))
            {
                int l_folderId = ReadInt(l_folder, "id", -1);
                foreach (XElement l_file in l_folder.Descendants("file"))
                {
                    int l_fileId = ReadInt(l_file, "id", -1);


                    float l_tmpX = ReadFloat(l_file, "pivot_x", 0);
                    float l_tmpY = ReadFloat(l_file, "pivot_y", 1);

                    l_defaultPivot.GetOrCreate(l_folderId).Add(l_fileId, new Vector2(l_tmpX, l_tmpY));
                }
            }
            model.Textures   = data.Textures;
            model.Rectangles = data.Rectangles;

            #region Entities
            // ----------------------Entityt  ---------------------
            foreach (var xEntity in input.Root.Elements("entity"))
            {
                Entity entity = new Entity();
                entity.Name = xEntity.Attribute("name").Value;

                #region Animations
                // --------------- Animaatiot ---------------------
                foreach (var xAnimation in xEntity.Elements("animation"))
                {
                    var animation = ParseAnimation(xAnimation);

                    #region Mainline

                    // --------------- Mainline -----------------------
                    foreach (var xMainlinekey in xAnimation.Element("mainline").Elements("key"))
                    {
                        var key = ParseMainlineKey(xMainlinekey);

                        // ---------------- object refs -----------------------
                        foreach (var xObjectRef in xMainlinekey.Elements("object_ref"))
                        {
                            var body = ParseObjectRef(xObjectRef);

                            key.Body.Add(body);
                        }

                        // ----------------- bone refs ----------------------
                        int i = 0;
                        foreach (var xBoneRef in xMainlinekey.Elements("bone_ref"))
                        {
                            var bone = ParseBoneRef(xBoneRef, ref i);

                            key.Bones.Add(bone);
                        }

                        animation.MainLine.Add(key);
                    } // mainline end

                    #endregion
                    #region Timeline

                    int vittu = 0;
                    // ------------------ timeline -----------------------------
                    foreach (var xTimeline in xAnimation.Elements("timeline"))
                    {
                        var timeline = ParseTimeline(xTimeline);
                        // ----------------------- frame ------------------
                        #region Frame

                        float minw, maxw, minh, maxh;
                        minh = maxh = minw = maxw = 0;
                        foreach (var xTimelineKey in xTimeline.Elements("key"))
                        {
                            var key = ParseTimelineKey(model, xTimelineKey, l_defaultPivot);
                            if (key.Type != TimelineType.Bone)
                            {
                                Rectangle r = model.Rectangles[key.Folder][key.File];
                                maxw = Math.Max(maxw, key.Location.X + r.Width);
                                minw = Math.Min(minw, key.Location.X);
                                maxh = Math.Max(maxh, key.Location.Y + r.Height);
                                minh = Math.Min(minh, key.Location.Y);
                            }
                            timeline.Keys.Add(key);
                        }

                        #endregion
                        Size size = new Size((int)(maxw - minw), (int)(maxh - minh));
                        timeline.Size = size;
                        animation.TimeLines.Add(timeline);
                    }
                    #endregion

                    entity.Add(animation);
                }
                #endregion

                model.Add(entity);
            }
            #endregion

            Thread.CurrentThread.CurrentCulture = currentCulture;
            return(model);
        }