internal Sprite(IEnumerable<ISwfTag> tags, ushort id, ushort frames, ISystemServices services) { ushort frame = 0; var removed = new List<ushort>(); var modified = new List<PlaceObject2Tag>(); var actions = new List<ActionBlock>(); ID = id; Frames = new SpriteFrame[frames]; foreach (var tag in tags) { if (tag is ShowFrameTag) { Frames[frame++] = new SpriteFrame(actions.ToArray(), removed, modified); actions.Clear(); } else if (tag is FrameLabelTag) _frameLabels.Add((tag as FrameLabelTag).Label, frame); else if (tag is PlaceObjectTag) modified.Add(new PlaceObject2Tag(tag as PlaceObjectTag)); else if (tag is PlaceObject2Tag) modified.Add(tag as PlaceObject2Tag); else if (tag is RemoveObjectTag) removed.Add((tag as RemoveObjectTag).Depth); else if (tag is RemoveObject2Tag) removed.Add((tag as RemoveObject2Tag).Depth); else if (tag is DoActionTag) actions.Add((tag as DoActionTag).Actions); else // TODO: Implement remaining valid tags // DoABC, StartSound, SoundStreamHead, SoundStreamHead2, SoundStreamBlock, PlaceObject3 UnhandledTag(tag, services); } }
public void ProcessSpriteFrame(SpriteFrame frame, MovieClip clip) { DisplayObject obj; var n = _displayList.First; foreach (var r in frame.RemovedObjects) { for (; n != null && n.Value.Depth < r; n = n.Next) ; if (n == null) break; if (n.Value.Depth == r) { if (n.Next == null) { n.Value.Removed(); _displayList.RemoveLast(); n = null; } else { n = n.Next; n.Previous.Value.Removed(); _displayList.Remove(n.Previous); } continue; } } n = _displayList.First; foreach (var m in frame.ModifiedObjects) { for (; n != null && n.Value.Depth < m.Depth; n = n.Next) ; if (n == null) { obj = DisplayObject.CreateAndPlace(m, clip); if (obj != null) _displayList.AddLast(obj); } else if (n.Value.Depth == m.Depth) { if (!n.Value.SetPlacement(m, clip)) { n = n.Next; _displayList.Remove(n); } } else { obj = DisplayObject.CreateAndPlace(m, clip); if (obj != null) _displayList.AddBefore(n, obj); } } }