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; }
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)); } }
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; }
private Tuple <int, int> IndexToCoords(int Index, SpriteHeader Header) { return(new Tuple <int, int>(Index % Header.Columns + 1, Index / Header.Columns + 1)); }
private int CoordsToIndex(Tuple <int, int> Coords, SpriteHeader Header) { return((Coords.Item2 - 1) * Header.Columns + (Coords.Item1 - 1)); }