| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 网页制作 > Flash教程 > Flash经验技巧 > 文章正文 用户登录
一个站点要运营成
迅雷联盟:个人站
迅雷联盟,个人站
一个失败者的网站
从名片看到一个小
一个大学生的网页
网络新生领域扫描
一个站长建站经历
一个网络创业者的
广捷居 一个永不言

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

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

作者:佚名 来源:不详 更新:2007-1-13 20:55:42 错误报告 我要投稿
  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块需要按照顺序。
文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。