SWF文件格式规范版本19表示MATRIX记录中的比例值存储为FB,在规范中的其他位置它表示FB是32位16.16的固定点值,但它有一个值,它使用了多少位存储值,在示例中,它是3.16值而不是16.16值。
我想知道这个,因为我想在已编译的SWF文件中插入精灵。我已经成功地在该精灵中使用了PlaceObject标记,但现在我有一个必须按比例缩小的图像,这也是在MATRIX记录中完成的,但首先我不需要FB,因为另一个图像已经在正确的规模。
编辑: 我将尝试使用Sothink SWF Quicker制作新的精灵,如果它不起作用我会尝试使用Adobe Flash CS 6制作一个带有sprite的简单swf文件,然后复制DefineSprite标签进入另一个SWF文件。如果有人回答,我会先用十六进制编辑器尝试使用Sothink SWF Quicker进行缩放。
EDIT2: 当我尝试导入SWF文件时,Sothink SWF Quicker崩溃。如果从我要创建的SWF文件中复制标签不起作用,我将删除我想用PlaceObject标签放置的图像,然后按比例缩小它。
EDIT3: 我不知道如何让Flash使用DefineSprite标签,所以我添加了一个DefineBitsLossless2标签,图像按比例缩小,我将在精灵中使用这个图像。我现在不再需要FB了,但是知道它们是如何工作仍然会很好,所以如果有人知道,请回答。
答案 0 :(得分:1)
矩阵记录开头如下:
HasScale UB[1]
NScaleBits If HasScale=1, UB[5]
ScaleX If HasScale=1, FB[NScaleBits]
ScaleY If HasScale=1, FB[NScaleBits]
...
FB [NScaleBits]确实是一个定点值,但不一定是16.16 - 它全部归结为NScaleBits(所以它与常规定点数不同,总是16.16)。
使用的位数是预先固定或指定的,就像Matrix一样,因此Flash Player 只知道。
例如,2.8是dex中的0x28000,在这种情况下NScaleBits是19,因为我们需要最少3位代表有符号数字“2”(3 + 16 = 19)。
我知道这是一个老问题。 不过,有人可能会偶然发现它,就像我一样。