重构SWF为fla文件四

4
 
  ●JS脚本的工作情况:
  当你在flash MX 2004中观察JS工作过程时感觉如何?是不是特爽?!我的感觉是不亚于观赏一部CD影片!
  如果你对ASV产生的JSFL脚本有了一点了解,那么这个过程好比对照着电影剧本看电影:
  JS首先打开了你已经先期保存的“rebuild.fla”文档,把场景及背景、帧速等文档参数重新进行设置,然后创建“元件库”,这个过程你可能看 不到,因为“库”面板缺省状况没有打开。
   重建“元件库”是在库中重新从目录中根据编号读入各元件。
   接下来就是构建“时间线”,其工作顺序是根据元件的编号进行的,这个过程的时间由原swf动画的内容多少、元件的复杂程度而定,而且工作中需要耗费大量系 统资源,有时会停顿(其实是进程分析)好长一段时间,视你的硬件配置而不同。
  那么,完成后的时间线与原动画有哪些不同?这应该是朋友们最关心的事!在介绍这些规律前,让我们再回忆一下在flash中直接导入swf时的情景:
  声音、AS代码、层、场景、动作变形全丢失了,按钮及MC影片夹的时间线也失去,只存第一帧的静态图形, 罩遮及引导动画基本失效,整个动画流程被堆积在一层逐帧序列中。
  这样的结果对我们来说是毫无意义的!
  再来看看ASV的JS脚本为我们重构的“时间线”,
  ● 对各动画元素及动画行为的处理规 律:

一、关于“场景”、“帧”、“帧标签”
  编辑时期保存在fla文件中的多场景信息,在编译成swf后已经消失,所以新时间线肯定仅一个场景!
  我们不难理解,全部动画的时间线长度就是依靠“帧”数决定的,比如原fla有10个场景,每个场景600帧,那么新时间线是6000帧,不会多也不会 少,加上动画的帧速,从而能保证原动画的总体框架不变。
  那么,在设计时做了很多的场景间“跳转指令”,比如:gotoAndPlay("场景 2", 36);或者nextScene(36);又会怎样呢?
  其实在swf中这类指令已经改为“绝对帧号”,比如上面的两条指令会改成:gotoAndPlay(136)。
  另外,如果设置了“帧标签”,那就更无问题,跳转指令会以“帧标签”为目标。
   许多动画的“load”单独置于第一个场景中,动画进程会否中断?不用担心,新时间线也处理得很好。

二、关于“层”
  新时间线的“层”是ASV从无到有重新构建的,“层”中的内容是根据各动画元素的索引(ID)号为顺序的,如果碰到MC影片夹,JS会进入该MC内部 的“子时间线”进行构建,然后再进入一下个元素。
  但是“JSFL”没有聪明到“节约使用层空间”,哪怕一条有1000个关键帧的层仅有1帧有内容,也会让999个空白帧浪费着!当JS开始一个新的 ID时,它会新建一个“层”。
   另外,朋友们记得flash中有一条“分散到层”的命令,即把同一帧中的多个元件分配到多个层,ASV就是采取这个方法,所以在新时间线中额外增加的 “层”很多。
  缺省设置下,在发布swf时“层”的显示顺序是“由下而上”,新“时间线”创建过程也是由下而上,依“L1”至“Ln”的命名规则进行。

三、关于“动作变形”
  “动作变形”是flash中最主要的变形形式。但在新的时间线中你绝对不会看到“动作变形”!
   “动作变形”的表现形式是:根据原变形所占关键帧长度,以“同一元件不同属性”的“多帧序列”形成变化效果。
   比如有个从无到有的“动作变形”,占10帧,其透明度从“0”到“100”,在“新时间线”表现为10个关键帧,其“Alpha”值从“0”以10为级数 递增到“100”,其它如尺寸、旋转、位置等变形与此类似。

四、 关于“形状变形”
  “形状变形”基本维持了原特征,这一点让我感到奇怪:因为变形对象是“打散”的,在“库”中没有对象的项目,这与我认为的重构时间线的依据是“关键帧 及库项目”相悖,它的运行原理得查看JS代码才能揭晓。
  另外,“形状变形”有时会丢失部分图形,甚至会发生“张冠李戴”,变形对象变成另一个元素,我相信这是个别现象。

五、 关于“影片夹(MC)”
  MC如同一个小swf,所以其规律与以上说的相仿,即MC中的“子时间线”也重新构建,也会额外添加许多“层”,等等。MC的重构成功率很高,有的 MC比整个主场景时间线还复杂,得有耐心哦。


六、 关于“按钮”
  按钮实际上是“另类”的MC,但它的内部结构一点没变,是保存得最完善的元件之一。
  但是,如果它的关键帧中含有多个元素对象,也会按“分散到层”的规律分布在各个新“层”中,如右图所示:
  

 
  

七、关于“AS程序、实例名、变量、数组、动态文本”
  值得庆幸的是,这一系列关系到动画特殊效果的程序模块及内部逻辑关系的特性还原得相当完美!包括一些“内外勾结”的命令如“attach”、 “fscommand”、“load”,以及depth层次属性等。
  但可能在某些较复杂的代码流程与其相对应的实例中发生一些逻辑错误,按理说,只要对象的“实例名”及其在时间线的位置正确,应该没问题,但JS毕竟也 是一段程序,根本上它是“刻板”地运行着,它做的工作是从无到有地创建新元件库、场景和时间轴,然后在其中重新安排各元素的位置与属性,一些不明确的因素 导致逻辑差错是免不了的。

八、 关于“组件(Components)智能MC(SmartClip)”
   “组件”与“智能MC”一个共同的特征就是“带参数的MC”,在他们的属性面板中会多出一个“参数设置”框,在“库”中的符号也与众不同,统称为“组 件”,但在新时间轴上,这些特性全部没有了,变化了最普通的MC,属性面板中参数设置也不复存在。
   其中“智能MC”运行正常,只是不能再在面板中设置参数,而“UI组件”并不顺利,这些组件一般均含有多层内部MC及封装了的代码,经我测试,成功率约在 一半吧,失败原因多数是逻辑关系的混乱。

九、关于“遮罩、热区(hitTest)动画”
  “遮罩”特性还原得很好,只不过新时间线会增加许多层来容纳原影片中放置在一层中的元件。“热区”动画关系到AS代码及鼠标事件,在新时间线中完全正 常。

十、关于“引导线”动画
  “引导线”动画的效果能毫不失真地正确回复,但我们已经知道,引导动画一般是以“动作变形”实现的,所以在重构动画时,“引导层”没有了,动画效果以 对象的“不同属性的逐帧序列”来表示,这一点参阅“动作变形”。

十一、关于“位图、图形及文本对象”
  如果swf中曾使用了“位图”,如PNG、GIF、JPG等,那么每个“位图”在新的元件库中会出现一对元件项目,一个是矢量元件,另一个是“位 图”,这是因为在Flash作品中不直接显示“位图”,“位图”只不过是作为矢量图内部填充的一个图片,不信,你只需删除库中的“位图”,影片中的矢量图 也将消失。
  “图形”(矢量图)以及“文本”对象在重建中没问题,后者还保存了字体、字号等属性,只不过未打散的文本如果在你的机器中无相应字体,将发出警告信 息。

十二、关于“声音、视频对象”
  swf中的声音经过多种模式的压缩转换,所以一般从swf中提取的MP3文件往往不能导入flash,ASV还原声音的功能特别强,我至今还未发现问 题,视频在ASV中自动转换为flash缺省的视频格式:FLV,在新时间线中,声音在时间线中的位置、压缩效果属性均完好地复原,而视频仍然是封装着的 一段序列。

十三、关于“读入保护”
  不少swf文件设置了“读保护”,以前,你用拆解工具另存为swf文件后,仍然不能被“导入”flash,现在,这些极其脆弱的加密机制在ASV面前 形同虚设!
  但作为一个可能的情况,一些动画编程采用了在AS脚本的某些部分加进一些“加密程序”,这一种非常规的加密手段,形起解析错误,可能连ASV也无能为 力了。

  经过我对几十个性质各异、内容不同的swf进行fla还原测试,结果是相当满意的,如果把重构后的“时间轴”外观的“不规 范”忽略,单从播放效果评价,成功率超过95%!有一个不能运行(用了UI组件),一个失真,其它全部正常。
   接下来,我们探讨一下如何把这些结果变得更完好一些。请继续...... 

 
4

posted on 2010-03-09 11:16  bicabo  阅读(410)  评论(0编辑  收藏  举报

导航