DefineShape 和 PlaceObject2
DefineShape 和 PlaceObject2
研究 SWF 结构最好的方法就是反编译、解剖自己做的 SWF。
新建 1.fla,发布设置里压缩影片和包括 XMP 元数据前面的勾去掉:
导出 1.swf。
1.fla 另存为 2.fla,舞台上画个红色矩形:
导出 2.swf。
启动 SWFXML;
toXML 模式选“全结构”,对 1.swf 和 2.swf 分别进行 swf2xml 操作,导出 1.xml 和 2.xml:
用文本比较器(推荐 TextDiff)比较 1.xml 和 2.xml:
可发现除了文件大小不同,2.swf 主要比 1.swf 多了一个 DefineShape 和一个 PlaceObject2。
用闪客精灵反编译 2.swf 还可以发现舞台上的形状其实是自动转成了图形元件:
Flash 在编译 SWF 时会分析需要哪些元素(图形、动画、字体等),编译成对应的“definition tag”,存到一个表(the dictionary)里,每个 definition tag 都有唯一的索引 id;
definition tag 们可以复用,比如用两个 PlaceObject2 往显示列表里放同一个圆形 DefineShape:
相关文件:https://github.com/zero-swf/SWFXML/tree/master/usage2