From 0eb97b22df76c8918dbea6d39d86f9b5cebf0b3c Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Thu, 18 Aug 2016 16:22:26 +0700 Subject: [PATCH] fix looped children sprites bug --- .../Editor/SwfTools/SwfContextExecuter.cs | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs index 270f0df..a7a09b3 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs @@ -20,9 +20,11 @@ namespace FlashTools.Internal.SwfTools { var tag = tags[CurrentTag++]; tag.AcceptVistor(this, dl); if ( tag.TagType == SwfTagType.ShowFrame ) { + ChildrenNextFrameLooped(dl); return true; } } + ChildrenNextFrameLooped(dl); return false; } @@ -163,20 +165,6 @@ namespace FlashTools.Internal.SwfTools { public SwfDisplayList Visit(ShowFrameTag tag, SwfDisplayList dl) { Debug.LogError(tag); - var sprites = dl.Instances.Values - .Where (p => p.Type == SwfDisplayInstanceType.Sprite) - .Select(p => p as SwfDisplaySpriteInstance); - foreach ( var sprite in sprites ) { - var sprite_def = MainContex.Library.FindDefine(sprite.Id); - if ( sprite_def != null ) { - if ( sprite.CurrentTag >= sprite_def.ControlTags.Tags.Count ) { - sprite.Reset(); - } - var sprite_executer = new SwfContextExecuter(MainContex, sprite.CurrentTag); - sprite_executer.NextFrame(sprite_def.ControlTags.Tags, sprite.DisplayList); - sprite.CurrentTag = sprite_executer.CurrentTag; - } - } return dl; } @@ -291,5 +279,38 @@ namespace FlashTools.Internal.SwfTools { }; MainContex.Library.Defines.Add(define_id, define); } + + bool IsSpriteTimelineEnd(SwfDisplaySpriteInstance sprite) { + var sprite_def = MainContex.Library.FindDefine(sprite.Id); + if ( sprite_def != null && sprite.CurrentTag < sprite_def.ControlTags.Tags.Count ) { + return false; + } + var children = sprite.DisplayList.Instances.Values + .Where (p => p.Type == SwfDisplayInstanceType.Sprite) + .Select(p => p as SwfDisplaySpriteInstance); + foreach ( var child in children ) { + if ( !IsSpriteTimelineEnd(child) ) { + return false; + } + } + return true; + } + + void ChildrenNextFrameLooped(SwfDisplayList dl) { + var sprites = dl.Instances.Values + .Where (p => p.Type == SwfDisplayInstanceType.Sprite) + .Select(p => p as SwfDisplaySpriteInstance); + foreach ( var sprite in sprites ) { + var sprite_def = MainContex.Library.FindDefine(sprite.Id); + if ( sprite_def != null ) { + if ( IsSpriteTimelineEnd(sprite) ) { + sprite.Reset(); + } + var sprite_executer = new SwfContextExecuter(MainContex, sprite.CurrentTag); + sprite_executer.NextFrame(sprite_def.ControlTags.Tags, sprite.DisplayList); + sprite.CurrentTag = sprite_executer.CurrentTag; + } + } + } } } \ No newline at end of file