Flash专栏: 基础教程 | 技巧运用 | MTV实例教程 | 游戏实例教程 | 实例教程 | AS教程(new)
photoshop专栏: 基础 | 进阶 | 技巧总汇 | 精彩实例 | 文字特效 | 滤镜魔术 | 实际应用
网页设计: Dreamweaver教程 | FireWorks教程 | CorelDraw设计 | Freehand/Illustrator教程 | 音乐转换教程
其他教程: 操作系统 | 程序设计 | 网站开发 | 图形图像 | 数据库 | 网络技术 | 安全相关 | 认证考试 | 硬件知识 | 服务器
Flash专栏>Flash基础教程>生成一个swf文件,文件的结构(2)   返回上一页

  日期:2006-08-29 12 作者:雪の猫 来源:闪吧
天气预报 IP地址 手机号码 邮编 翻译 在线代理 在线评书 好dj


生成一个swf文件,文件的结构(2)


swf文件中的基本数据类型有整型(包括8,16,32的有符号和无符号,但是我在变成中感觉不到两者的区别),定点数,浮点数,变长数。下面的数据类型也是样式书中定义的基本类型,但是他们的定义都是以上面的4中作为基础的:

字符串,字符串是以全0结束的byte序列,采用utf-8编码。有关utf-8可以参考http://www.unicode.org/unicode/faq/utf_bom.html#UTF8

语言种类,语言种类是一个byte,描述的不是编码而是自然语言。用来处理字体还有在需要换行的时候处理断字,比如一个很长的英文单词出现在行尾但显示不下,可能会被处理显示到行首。

record,这个有点像C语言的structure,或者支持类的语言中没有方法的类。它按照格式顺序的储存一些上述的类型。样式书中有这样的一些record:

RGB color record

项目  类型  说明
Red UI8  红色值 
Green UI8 绿色值
Blue  UI8  蓝色值

ARGB ,
Aplha UI8 透明值,0为完全透明
Red UI8  红色值 
Green UI8 绿色值
Blue  UI8  蓝色值


RGBA ,
Red UI8 红色值 
Green UI8  绿色值
Blue UI8 蓝色值
Aplha UI8  透明值,0为完全透明

上面的3个是表示颜色的

Rectangle ,这个以前写过了,参考第一篇http://space.flash8.net/space/html/55/381555_itemid_307609.html

Matrix 表示的是一个形状的仿射变换,有关仿射变换可以参考java.awt.geom.AffineTranform类,或者flash.geom.Matrix类的说明,或者任何一本大学的几何教材。
 项目 类型  说明 
HasScale   UB[1] 如果包含缩放,则为1 
NScaleBits 如果HasScale=1,UB[5]否则没有该项 指示下面两项,每项要使用的bit数
ScaleX 如果HasScale=1,FB[NScaleBits] x方向上的缩放
ScaleY 如果HasScale=1,FB[NScaleBits] y方向上的缩放
HasRotate UB[1] 如果包含旋转,或者扭曲,则为1
NRotateBits 如果HasRotate=1,UB[5] 指示下面两项,每项要使用的bit数
RotateSkew0 如果HasRotate=1,FB[NScaleBits] 有关旋转和扭曲的第一个值
RotateSkew0  如果HasRotate=1,FB[NScaleBits] 有关旋转和扭曲的第二个值
NTranslateBits UB[5] 指示下面两项,每项要使用的bit数
TranslateX SB[NTranslateBits] x方向上平移的量,单位是twips
TranslateY SB[NTranslateBits] y方向上平移的量,单位是twips

这个matrix record对应一个2x3矩阵:

  ScaleX       RotateSkew0 
( RotateSkew1  ScaleY      )
  TranslateX   TranslateY

对于在一个坐标系中的(x, y),变换后的 (x', y')按照如下方法得到:
x' = x * ScaleX + y * RotateSkew1 + TranslateX
y' = x * RotateSkew0 + y * ScaleY + TranslateY

更多的内容请参考样式书。

还有两个:Color Matrix record和Color Matrix with aplha record,是处理颜色转换,这和我暂时没有很大关系,所以如果将来感兴趣了再去参考吧。注意到这些后面的这些record上都对应了flash.geom包的类,但是它们却并非flash8中加入的新成员。所以不要以为只关心7以前的版本就完全没有必要看它们。

这样,基本的数据类型就是这样多了。于是,一个深刻的问题出现在我的面前。我要怎么使用这些类型?这里连一个声明/调用的语法都没有。

文件结构


要注意,现在我的事情是理解swf文件的结构(最后要生成一个)。这不是编程,而是编码。所以我必须按照swf的文件结构,按照一定的顺序把正确类型的数据放在正确的位置。这个就是本文的正体,上面噜苏的一堆其实算是对上一篇的补完。

swf文件是文件头和一些叫做tag的组成的。

上次介绍了header,这次来看一看tag:

tag的头

tag是以tag的类别和一个表述该tag的长度的域开始的,根据这个tag的长度不同,这个tag的头有两种:短格式的头和长格式的。短格式的tag要求数据内容(不包括头)的长度不超过62 bytes;而长格式则可以最多达4GB(我剩下的硬盘空间还不到4G哩,装的都是游戏,厚厚。正在写东西时候不能提游戏,想放下就去打)。

短格式
项目 类型  说明 
TagCodeAndLength UI16 高10位是tag类别,低6位是长度

长格式
项目 类型  说明 
TagCodeAndLength  UI16 形式上和短格式一致,但是低6位的长度的数值固定为0x3f
Length   SI32 数据长度

tag的种类

在一个swf中包含两中tag分别是Definition(定义)和Control(控制)。定义块中包含了对swf要包含内容的定义。比如一个图形,文字之类。定义块中要为每一个内容的定义指派一个唯一的id叫做character id(不要误会character的意义,这里不是指字符,而大约是标志的意思,而我想从这里开始使用标志这个词)。swf把这些标志(character)存放在一个叫做字典(dictionary)的结构中。注意定义块不会导致任何的屏幕绘制。

控制块处理,创建字典中标志的实例,绘制屏幕,控制流程等。

顺序

除了FileAttribute要放在最前(这是一些全局的东西),end它要放在最末。块之间不需要顺序。但是要保证依存关系,比如块B要引用块A的标志,就不能在A的前面出现。Stream块需要按照顺序。
   责任编辑:silvia    时间:2006年8月27日


 
高手云集 版权所有 1998-2006