介绍:
swfassist是生成swf 文件的一个库,好像是小鬼子(无种族歧视涵义)开源的,可以通过 代码生成一个swf,而不用通过AS或fB等 开发工具发布(其实原理都一样),可以通过AIR生成swf,而无论用户机子上是否有 flash、FB等工具(废话

这个库资料之少,文档之不明确,真是很让人震精,而且网络上介绍也比较少。

不废话先看代码

  1. var swf:SWF = new SWF();
  2. swf.header.version = 9;
  3. swf.header.frameSize.xMax = 500;
  4. swf.header.frameSize.yMax = 375;
  5. swf.header.frameRate = 24;
  6. swf.header.numFrames = 0;
  7. var bgColor:SetBackgroundColor = new SetBackgroundColor();
  8. bgColor.backgroundColor.fromUint(0x000000);
  9. swf.tags.addTag(bgColor);
  10. for (var i:uint = 0; i < files.length; ++i)
  11. {
  12. var file:File = File(files[i]);
  13. var defineJPEG:DefineBitsJPEG2 = new DefineBitsJPEG2();
  14. defineJPEG.characterId = (i * 2) + 1;
  15. var fileStream:FileStream = new FileStream();
  16. fileStream.open(file, FileMode.READ);
  17. fileStream.readBytes(defineJPEG.jpegData);
  18. fileStream.close();
  19. fileStream = null;
  20. swf.tags.addTag(defineJPEG);
  21. var defineShape:DefineShape = new DefineShape();
  22. defineShape.shapeId = (i * 2 + 1) + 1;
  23. defineShape.shapeBounds.xMax = 500;
  24. defineShape.shapeBounds.yMax = 375;
  25. var fillStyle:FillStyle = new FillStyle();
  26. fillStyle.fillStyleType = FillStyleTypeConstants.CLIPPED_BITMAP_FILL;
  27. fillStyle.bitmapId = (i * 2) + 1;
  28. fillStyle.bitmapMatrix.hasScale = true;
  29. fillStyle.bitmapMatrix.scaleX = 20;
  30. fillStyle.bitmapMatrix.scaleY = 20;
  31. var shape:ShapeWithStyle = defineShape.shapes;
  32. shape.fillStyles.fillStyles.push(fillStyle);
  33. var r1:StyleChangeRecord = new StyleChangeRecord();
  34. r1.fillStyle0 = 1;
  35. r1.moveDeltaX = 0;
  36. r1.moveDeltaY = 0;
  37. r1.stateFillStyle0 = true;
  38. r1.stateMoveTo = true;
  39. var r2:StraightEdgeRecord = new StraightEdgeRecord();
  40. r2.verticalLine = true;
  41. r2.deltaY = 375;
  42. var r3:StraightEdgeRecord = new StraightEdgeRecord();
  43. r3.horizontalLine = true;
  44. r3.deltaX = 500;
  45. var r4:StraightEdgeRecord = new StraightEdgeRecord();
  46. r4.verticalLine = true;
  47. r4.deltaY = -375;
  48. var r5:StraightEdgeRecord = new StraightEdgeRecord();
  49. r5.horizontalLine = true;
  50. r5.deltaX = -500;
  51. shape.shapeRecords.push(r1, r2, r3, r4, r5);
  52. swf.tags.addTag(defineShape);
  53. var placeObject:PlaceObject2 = new PlaceObject2();
  54. placeObject.characterId = (i * 2 + 1) + 1;
  55. placeObject.depth = i + 1;
  56. placeObject.hasCharacter = true;
  57. swf.tags.addTag(placeObject);
  58. for (var fadeIn:uint = 0; fadeIn < 20; ++fadeIn) {
  59. var fadeObject:PlaceObject2 = new PlaceObject2();
  60. fadeObject.depth = i + 1;
  61. fadeObject.isMove = true;
  62. fadeObject.hasColorTransform = true;
  63. fadeObject.colorTransform.hasMultiplication = true;
  64. fadeObject.colorTransform.redMultiplication = 256;
  65. fadeObject.colorTransform.greenMultiplication = 256;
  66. fadeObject.colorTransform.blueMultiplication = 256;
  67. fadeObject.colorTransform.alphaMultiplication = (((1.0 / 20) * fadeIn) * 256);
  68. swf.tags.addTag(fadeObject);
  69. swf.tags.addTag(new ShowFrame());
  70. swf.header.numFrames++;
  71. }
  72. if (i > 0) {
  73. var removeObject:RemoveObject2 = new RemoveObject2();
  74. removeObject.depth = (i - 1) + 1;
  75. swf.tags.addTag(removeObject);
  76. }
  77. for (var n:uint = 0; n < (24 * 3); ++n) {
  78. swf.tags.addTag(new ShowFrame());
  79. swf.header.numFrames++;
  80. }
  81. }
  82. var swfBytes:ByteArray = new ByteArray();
  83. new SWFWriter().writeSWF(new ByteArrayOutputStream(swfBytes), new WritingContext(), swf);
  84. var swfStream:FileStream = new FileStream();
  85. swfStream.open(File.desktopDirectory.resolvePath('slideshow.swf'), FileMode.WRITE);
  86. swfStream.writeBytes(swfBytes);
  87. swfStream.close();

复制代码

这段东西是库自带的一段demo,网络上的例子基本是改至这段东西。

下面是我知道的一些东西:

SWF这个类代表将要生成的SWF,最好这个文件会以二进制流方式生成一个swf文件。所以是必须的。
然后 参数代表
【head】文件头包涵基本swf文件属性:
--version  :版本,此swf支持最低版本的 播放器
--frameSize :stage的大小, 数据类型是一个flash.geom.Rectangle类似的一个矩形数据类型,是一个帧(尺码、大小)字段(FrameSize field)会有这些属性
Xmin、Ymin、还有Xmax和Ymax(成员声明宽度和高度),后面我们还会见到。
--frameRate  :帧频

所以
frameSize.xMax = 500;
frameSize.yMax = 375
frameRate = 24
实际是设置了这个生成这个swf文件的场景宽高,就如:[SWF(width = 500, height = 375, frameRate = 24)]

--isCompressed :是否是压缩格式,设置后生成swf会被写入0x46, 0x57, 0x53(未压缩)或0x46,0x57, 0x43(压缩)

下面是具体的tag,大家都知道或将知道,swf文件是tag叠加的结果,就是下一个tag会对上一个相关的tag有依赖,简单说比如你要先定义一个叫“lewis_mc”的元件后,才能对这个元件进行控制(这是废话,但很重要
原文是这样的:Flash Player processes all the tags in a SWF file until a ShowFrame tag is encountered. At this point, the display list is copied to the screen and Flash Player is idle until it is time to process the next frame. The contents of the first frame are the cumulative effect of performing all the control tag operations before the first ShowFrame tag. The contents of the second frame are the cumulative effect of performing all the control tag operations from the beginning of the file to the second ShowFrame tag, and so on.

  1. var bgColor:SetBackgroundColor = new SetBackgroundColor();
  2. bgColor.backgroundColor.fromUint(0x000000);
  3. swf.tags.addTag(bgColor);

复制代码

这句话实际上完成了我们代码里设置场景背景的颜色的工作,fromUint这东西会把你的十六进制的颜色通过右移">>"分离成RGB单独色彩数据,反正改fromUint里面的值就好了。接着我们会用到很重要的一个 API  :tags.addTag(bgColor),addTag()是写入tag到swf的意思,这是第一个我们加入的tag,如果要自定义一个tag必须继承于AbstractTag这个抽象类,其实tag可以自定义,因为FP发现不能解释的tag 的时候是会放过的,所以可以随便增加tag而不破坏这个swf,有些直接改swf文件个工具就是这样的原理。

接下来是功能核心了,就是如果导入一张 图片,并且生成一个包涵这种图片的swf文件。

  1. var defineJPEG:DefineBitsJPEG2 = new DefineBitsJPEG2();
  2. defineJPEG.characterId = (i * 2) + 1;
  3. var fileStream:FileStream = new FileStream();
  4. fileStream.open(file, FileMode.READ);
  5. fileStream.readBytes(defineJPEG.jpegData);
  6. fileStream.close();
  7. fileStream = null;
  8. swf.tags.addTag(defineJPEG);
  9. var defineShape:DefineShape = new DefineShape();
  10. defineShape.shapeId = (i * 2 + 1) + 1;
  11. defineShape.shapeBounds.xMax = 500;
  12. defineShape.shapeBounds.yMax = 375;
  13. var fillStyle:FillStyle = new FillStyle();
  14. fillStyle.fillStyleType = FillStyleTypeConstants.CLIPPED_BITMAP_FILL;
  15. fillStyle.bitmapId = (i * 2) + 1;
  16. fillStyle.bitmapMatrix.hasScale = true;
  17. fillStyle.bitmapMatrix.scaleX = 20;
  18. fillStyle.bitmapMatrix.scaleY = 20;
  19. var shape:ShapeWithStyle = defineShape.shapes;
  20. shape.fillStyles.fillStyles.push(fillStyle);
  21. var r1:StyleChangeRecord = new StyleChangeRecord();
  22. r1.fillStyle0 = 1;
  23. r1.moveDeltaX = 0;
  24. r1.moveDeltaY = 0;
  25. r1.stateFillStyle0 = true;
  26. r1.stateMoveTo = true;
  27. var r2:StraightEdgeRecord = new StraightEdgeRecord();
  28. r2.verticalLine = true;
  29. r2.deltaY = 375;
  30. var r3:StraightEdgeRecord = new StraightEdgeRecord();
  31. r3.horizontalLine = true;
  32. r3.deltaX = 500;
  33. var r4:StraightEdgeRecord = new StraightEdgeRecord();
  34. r4.verticalLine = true;
  35. r4.deltaY = -375;
  36. var r5:StraightEdgeRecord = new StraightEdgeRecord();
  37. r5.horizontalLine = true;
  38. r5.deltaX = -500;
  39. shape.shapeRecords.push(r1, r2, r3, r4, r5);
  40. swf.tags.addTag(defineShape);
  41. var placeObject:PlaceObject2 = new PlaceObject2();
  42. placeObject.characterId = (i * 2 + 1) + 1;
  43. placeObject.depth = i + 1;
  44. placeObject.hasCharacter = true;
  45. swf.tags.addTag(placeObject);

复制代码

var defineJPEG efineBitsJPEG2 = new DefineBitsJPEG2();
这个tag表示有渐变的JPG
===============================================================
defineJPEG.characterId = (i * 2) + 1;
关键,这里要解释一下

在swf文件里tag有俩类型Definition Tags(定义类型标签)和 Control Tags(控制类型标签)

【定义类型标签】:简单说就是图片,声音,文字等等资源型的东西,相当于我们flash里的库文件就对了,所以他可以很复杂,资源可以嵌套,但因为是库文件,所以他们是不会被FP被渲染出来的,这个库专业的名字叫:Dictionary 字碘

【控制类型标签】:简单的说就是控制库文件的,他来控制如何,何时渲染我们的资源
所以,每个在字典里的资源必须有一个唯一的标示,让控制类型标签调用。
而characterId就是字典标签,每个资源必须有并且有唯一的一个characterId,和库里定义一个Linkage一样。
注意必须是唯一的,的,的,的……(回音)

所以DefineBitsJPEG2 是一个【定义类型标签】
说完继续代码

  1. var fileStream:FileStream = new FileStream();
  2. fileStream.open(file, FileMode.READ);
  3. fileStream.readBytes(defineJPEG.jpegData);
  4. fileStream.close();
  5. fileStream = null;

复制代码

这是AIR的打开文件二进制流读入一个jpg文件不多说。

swf.tags.addTag(defineJPEG);加入这个图片的tag,里面包含图片的二进制信息,想象相当于在库里边有一张图片了。

  1. var defineShape:DefineShape = new DefineShape();
  2. defineShape.shapeId = (i * 2 + 1) + 1;
  3. defineShape.shapeBounds.xMax = 500;
  4. defineShape.shapeBounds.yMax = 375;

复制代码

建立一个用来放置我们的图片,xMax、yMax 代表是一个帧(尺码、大小)字段(FrameSize field),代表这个shape的宽高。这段代码开始,直到swf.tags.addTag(defineShape);
这句,是在定义一个【控制类型标签】,用来在字典中提取刚才那种图,渲染到场景上。(冗长吧~~

  1. var tagFS:FillStyle = new FillStyle();
  2. tagFS.color.fromUint(0xff000000);
  3. tagFS.fillStyleType = 67;
  4. tagFS.bitmapId = (_frame-1)*2+1;
  5. tagFS.bitmapMatrix.hasScale = true;
  6. tagFS.bitmapMatrix.scaleX = 20;
  7. tagFS.bitmapMatrix.scaleY = 20;

复制代码

这个标签是定义渲染的一些东西,scaleX = scaleY = 20 这句是必须要的,意思是不缩放,有兴趣可以调30、40试试就知道。tagFS.bitmapMatrix中还有俩个属性translateX、translateY这是图片的偏移量,如果你不想图片以父容器(0,0)点渲染。就要改变它们了。

var shape:ShapeWithStyle = defineShape.shapes;
shape.fillStyles.fillStyles.push(fillStyle);

把我们的defineShape和fillStyle加到一个Shape【控制类型标签】里。

关键就是这个Shape控制标签了

  1. shape.fillStyles.fillStyles.push(fillStyle);
  2. var r1:StyleChangeRecord = new StyleChangeRecord();
  3. r1.fillStyle0 = 1;
  4. r1.moveDeltaX = 0;
  5. r1.moveDeltaY = 0;
  6. r1.stateFillStyle0 = true;
  7. r1.stateMoveTo = true;
  8. var r2:StraightEdgeRecord = new StraightEdgeRecord();
  9. r2.verticalLine = true;
  10. r2.deltaY = 375;
  11. var r3:StraightEdgeRecord = new StraightEdgeRecord();
  12. r3.horizontalLine = true;
  13. r3.deltaX = 500;
  14. var r4:StraightEdgeRecord = new StraightEdgeRecord();
  15. r4.verticalLine = true;
  16. r4.deltaY = -375;
  17. var r5:StraightEdgeRecord = new StraightEdgeRecord();
  18. r5.horizontalLine = true;
  19. r5.deltaX = -500;
  20. shape.shapeRecords.push(r1, r2, r3, r4, r5);

复制代码

我们看到最后这句shape.shapeRecords.push(r1, r2, r3, r4, r5);他定义这个Shape渲染的位置!!
而最经常要改动是这段:

var r1:StyleChangeRecord = new StyleChangeRecord();
                                r1.fillStyle0 = 1;
                                r1.moveDeltaX = 0;
                                r1.moveDeltaY = 0;
                                r1.stateFillStyle0 = true;
                                r1.stateMoveTo = true;
他定义了这个Shape类似于初始点的东西,就是MC左上角的那个点,定义这个店到底在哪里?

其中moveDeltaX ,moveDeltaY 就是这个shape的点的左边,以场景最左上角(0,0)算起。
但如果你想定义我们这个图片出现在(3,3)这个点
只是这样:

r1.moveDeltaX = 3;
r1.moveDeltaY = 3;
是不行的。因为shape是移动过去了,但你的图片还是在(0,0)这个点……

那怎么办?
刚才我们知道tagFS.bitmapMatrix有translateX、translateY属性我们要改变这俩个值。
tagFS.bitmapMatrix.translateX = 3;
tagFS.bitmapMatrix.translateY = 3;
这样才完成了一个图片的移动。

不过这只是我的方法而已,不知道那位大神可以出来指点一下,我先谢谢了~~

好,最后,

  1. var placeObject:PlaceObject2 = new PlaceObject2();
  2. placeObject.characterId = (i * 2 + 1) + 1;
  3. placeObject.depth = i + 1;
  4. placeObject.hasCharacter = true;
  5. swf.tags.addTag(placeObject);

复制代码

必须要有的。他代表我们图片一些属性,比如深度、旋转(旋转竟然在这里定义……)、元件上的代码(as2.0好像是onClipEvent开头)这样吧他加入他tag里边去。就OK了。

zhuanzai :http://bbs.9ria.com/thread-85155-1-1.html

SWFAssist:

http://hi.baidu.com/%BA%DA%F2%E1/blog/item/f43945dac1a6db3e33fa1cbd.html

http://privatefunction.net/tag/swfassist/

http://vanillaloveyou.wordpress.com/2008/02/14/swfassist-%E6%B7%BB%E5%8A%A0%E5%B9%B6%E4%BF%9D%E5%AD%98mp3%E5%AE%9E%E9%AA%8C/

libspark.swfassist的体会相关推荐

  1. 关于位姿变换的一点体会

    关于位姿变换的一点体会 1.题外话 2.刚体的位姿变换 2.1 位姿变换的定义 2.2 旋转矩阵的具体形式 2.2.1 二维情况 2.2.2 三维情况 3.旋转方向 4.平移方向 1.题外话 对于刚体 ...

  2. 学计算机的好处处300字,学计算机的心得体会300字

    学计算机的心得体会300字 我们从一些事情上得到感悟后,可以寻思将其写进心得体会中,这么做可以让我们不断思考不断进步.那么好的心得体会都具备一些什么特点呢?以下是小编精心整理的学计算机的心得体会300 ...

  3. 计算机网站编辑需要学什么,网站编辑工作的心得体会

    网站编辑工作的心得体会 从事网络编辑之前,我对网络编辑这个名词可谓前所未闻,一无所知.从起步时我也认为网络编辑的工作应该是很轻松的,每天就是相同的工作:复制加粘贴,感觉是一个"搬运工&quo ...

  4. matlab实验是啥,matlab实验心得体会

    matlab实验心得体会这个就是我自己做出来的,发现用soundsc听出来还行,但是用wavwrite就变的很难听. 后来发现PB写的很好,而且还能够把前面一段没有噪音的部分给保存下来,我就看了他的代 ...

  5. 动态规划和分治法,贪心算法以及递归的再一次深刻理解和体会

    每次体会算法都有新的感觉,刷题越多,对算法的理解感觉也就越深刻. 下面我们来重新体会下分治法,动态规划,贪心法,递归的理解. 1.分治法: 将问题分成单独的阶段,每个阶段互相不干扰很独立,如10米长的 ...

  6. 新浪微博推广网站的一些实践体会

    本以为微博推广很难,每天都要刷粉刷内容的,也本以为做微博推广也很简单,一不卖产品.二不卖服务的,目的单纯灵活性强些,做了之后才发现都不是那么回事,微博虽然也过了"火了",但新媒体还 ...

  7. ubuntu14.04初体会

        2014年4月17日ubuntu新的长期支持版14.04公布了,中国时间18日一早就能够下载到.     18日晚.在我的X200上安装上了14.04,算是比較早一批体会到14.04正式版的人 ...

  8. 《课程的反思与重建--我们需要什么样的课程观》之心得体会

    <课程的反思与重建--我们需要什么样的课程观>之 学习<课程的反思与重建>心得体会<?xml:namespace prefix = o ns = "urn:sc ...

  9. 《课程的反思与重建--我们需要什么样的课程观》 心得体会

    <课程的反思与重建--我们需要什么样的课程观> 学习<课程的反思与重建>心得体会<?xml:namespace prefix = o ns = "urn:sch ...

最新文章

  1. 关于Flutter初始化流程,我必须告诉你的是...
  2. c#多维数组的建立及操作 总结
  3. 中的实践 中兴_中兴通讯5G智慧治水业务在千岛湖畔下姜村成功实践
  4. SQL2005结合ROW_NUMBER()高效分页存储过程
  5. 现代软件工程系列 创新靠学分
  6. JDBC学习(七、批处理操作)
  7. BZOJ4072[Wf2014] baggage
  8. STM32F4之SDIO接口
  9. 瑞幸最新股权曝光:大钲资本持股33.9% 有57%投票权
  10. scrapy--dytt(电影天堂)
  11. mac php 连接 mssql 2008,php5.3.x连接MSSQLserver2008
  12. OBS直播软件-简介
  13. jQuery attr()获取属性和设置属性的方法
  14. c语言函数指针、结构体、枚举实例(详细)解析(快速掌握)
  15. 如何把Kotlin代码转成Java代码、把Java代码转成Kotlin代码
  16. 【STM32】一次F105 USB OTG驱动填坑记录
  17. java内省的意思_java内省和反射的区别
  18. php 伪静态 获取当前页面路径_php伪静态如何获取地址栏url -
  19. realvnc的卸载
  20. IDEA maven 项目依赖无法解析

热门文章

  1. sp_help用法_sp_updatestats概述和用法
  2. aws rds监控慢sql_在AWS RDS SQL Server上的SSAS中部署表格数据库
  3. sql查询禁用缓存_如何在SQL Server 2017中启用和禁用身份缓存
  4. SQL Server数据库持续集成简介
  5. sql server表分区_SQL Server中的FORCESCAN和分区表
  6. Linux下安装Go环境
  7. 一篇文章让你学透Linux系统中的more命令
  8. OC中对象的description方法
  9. visual studio 代码分析利器 FxCop
  10. 总结开发Silverlight项目准则 [转]