Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
                }
            }
        }