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