Пример #1
0
        private void PopulateAnimations(SpriteDataContent Sprite, SpriteHeader Header, IEnumerable <string> AnimationRows)
        {
            List <SpriteAnimationDataContent> Animations = new List <SpriteAnimationDataContent>();

            foreach (var AnimationRow in AnimationRows)
            {
                var            Reader        = CreateReader(AnimationRow);
                string         AnimationName = Reader.Read();
                float          Duration      = float.Parse(Reader.Read());
                var            Frames        = ParseFrames(Header, Reader).ToArray(); // Array to process entirely so we do Reader.Read at right times.
                AnimationFlags Flags         = AnimationFlags.None;
                while (Reader.HasMore())
                {
                    string         NextFlag = Reader.Read();
                    AnimationFlags Flag     = (AnimationFlags)Enum.Parse(typeof(AnimationFlags), NextFlag);
                    Flags |= Flag;
                }
                var FrameNames = Frames.Select(IndexToName);
                Dictionary <string, TimeSpan> FrameDurations = new Dictionary <string, TimeSpan>();
                foreach (var FrameName in FrameNames)
                {
                    FrameDurations.Add(FrameName, TimeSpan.FromMilliseconds(Duration));
                }
                SpriteAnimationDataContent Animation = new SpriteAnimationDataContent()
                {
                    FrameDurations = FrameDurations,
                    IsDefault      = (Flags & AnimationFlags.Default) != 0,
                    IsLooped       = (Flags & AnimationFlags.Looped) != 0,
                    Name           = AnimationName
                };
                Animations.Add(Animation);
            }
            Sprite.Animations = Animations;
        }
Пример #2
0
        private IEnumerable <Tuple <int, int> > ParseFrames(SpriteHeader Header, ColumnReader Reader)
        {
            // First, handle doing an entire row or column.
            string FrameData = Reader.Read();

            switch (FrameData[0])
            {
            case 'R':
                int RowNum = int.Parse(FrameData.Substring(1));
                for (int i = 1; i <= Header.Columns; i++)
                {
                    yield return(new Tuple <int, int>(i, RowNum));
                }
                yield break;

            case 'C':
                int ColNum = int.Parse(FrameData.Substring(1));
                for (int i = 1; i <= Header.Rows; i++)
                {
                    yield return(new Tuple <int, int>(ColNum, i));
                }
                yield break;
            }
            // Then, allow for things like {1, 2}	{1, 4}.
            // When needed anyways. For now just throw.
            var    Start      = ReadIndex(FrameData);
            string EndData    = Reader.Read();
            var    End        = ReadIndex(EndData);
            int    StartIndex = CoordsToIndex(Start, Header);
            int    EndIndex   = CoordsToIndex(End, Header);

            for (int i = StartIndex; i <= EndIndex; i++)
            {
                yield return(IndexToCoords(i, Header));
            }
        }
Пример #3
0
        private void PopulateFrames(SpriteDataContent Sprite, SpriteHeader Header)
        {
            var TextureSize = GetTextureSize(Header.Texture);
            var GridSize    = new Tuple <int, int>(TextureSize.Item1 / Header.Columns, TextureSize.Item2 / Header.Rows);
            List <SpriteFrameDataContent> Frames = new List <SpriteFrameDataContent>();

            for (int y = 0; y < Header.Rows; y++)
            {
                for (int x = 0; x < Header.Columns; x++)
                {
                    int       StartY    = y * GridSize.Item2;
                    int       StartX    = x * GridSize.Item1;
                    Rectangle Source    = new Rectangle(StartX + Header.Margins.Left, StartY + Header.Margins.Top, GridSize.Item1 - Header.Margins.Right, GridSize.Item2 - Header.Margins.Bottom);
                    string    FrameName = IndexToName(new Tuple <int, int>(x + 1, y + 1));
                    SpriteFrameDataContent FrameData = new SpriteFrameDataContent()
                    {
                        Name   = FrameName,
                        Source = Source
                    };
                    Frames.Add(FrameData);
                }
            }
            Sprite.Frames = Frames;
        }
Пример #4
0
 private Tuple <int, int> IndexToCoords(int Index, SpriteHeader Header)
 {
     return(new Tuple <int, int>(Index % Header.Columns + 1, Index / Header.Columns + 1));
 }
Пример #5
0
 private int CoordsToIndex(Tuple <int, int> Coords, SpriteHeader Header)
 {
     return((Coords.Item2 - 1) * Header.Columns + (Coords.Item1 - 1));
 }