AS3 的单元测试框架——asunit

by 老姜 2012.2.1 16:56

Tags:

Flash技术

Flash Player 11的新功能

by 老姜 2012.2.1 16:52

Flash Player 所拥有的全部功能可以在这里查看:http://www.adobe.com/cn/products/flashplayer/features.html 。同时在这个页面也可以查看到每个新版本所新增的功能。以下是 Flash Player 11 所拥有的新功能: 

  • Stage 3D 加速图形渲染
    • 探索 Adobe 高性能 2D/3D GPU 硬件加速图形渲染的新架构,为应用程序高级渲染提供了低级 Stage3D API,带来互动体验类的框架开发。
  • 本机 64 位支持
    • Flash Player 现在可利用 Linux®、Mac OS 和 Windows® 上对 64 位操作系统和 64 位网页浏览器的本地支持。
  • 相机的 H.264/AVC 软件编码
    • 来自您的计算机摄像头的美丽流媒体视频,具有更高的压缩效率和行业广泛的支持,实现高品质的实时通信(例如,视频聊天和视频会议)和视频直播节目。
  • 移动的内容保护支持
    • 现在 Android 设备可以支持 Flash Access 内容保护。广播装置现在可以获得和宣传更多客户的最喜爱移动设备。
  • 受保护的 HTTP 动态流化 (HDS)
    • 跨设备保护流视频,同时取消部署复杂的许可证服务器。
  • 受保护的 HTTP 动态流化 (HDS)
    • 跨设备保护流视频,同时取消部署复杂的许可证服务器。
  • 安全随机数生成器
    • 开发人员现在可以利用加密安全随机数生成来构建更安全的算法和协议。
  • TLS 安全套接字支持
    • 利用客户端/服务器应用程序对安全通信的全新支持。
  • 电话的 G.711 音频压缩
    • 通过 Flash Media Gateway (FMG) 和其他第三方客户端(通过开放 RTMP 协议),支持与传统电话系统的互操作性,而无需转码。
  • 三次 Bezier 曲线
    • 轻松创建复杂的三次 Bezier 曲线,无需通过 cubicCurveTo 绘制 API 自定义 ActionScript® API。
  • 增强的高分辨率位图支持
    • 可以开发使用大量位图的应用程序。BitmapData 对象不再局限于 16 兆像素(16,777,215 像素)的最高分辨率,最大位图的宽度/高度不再局限于 8,191 像素。
  • 异步位图解码
    • 通过解码初始加载而非点播加载的图像,提高应用程序的响应,提供更流畅的动画。图像视需要缓存。
  • 本机 JSON(JavaScript 对象表示法)
    • ActionScript 开发人员现在可以利用高性能本地解析和生成 JSON 格式数据。开发人员可以将现有数据无缝集成到他们的项目中。
  • 垃圾收集通知
    • GC 通知 API 对垃圾收集进度提供了额外的控制,使垃圾收集过程不会破坏用户体验。
  • 套接字进度事件
    • 通过确定写入缓冲区剩余字节数的新特性以及数据发送至网络层的新事件,改进数据传输管理。新的 API 允许应用程序轻松跟踪进展情况并提供反馈。
  • JPEG-XR 支持
    • 支持 JPEG-XR 高级图像压缩标准(国际标准 ISO/IEC 29199-2),具备比 JPEG 更高效的压缩,同时支持有损和无损压缩,并增加对 alpha 通道透明度的支持。
  • 高效率 SWF 压缩支持
    • 利用 LZMA 压缩减少 SWF 文件大小高达 40%,通过缩短下载时间和减少带宽消耗,使用户能够从更丰富的体验中受益。
  • 新的 removeChildren API
    • DisplayObjectContainer 现在实施了 removeChildren API,使开发人员能够运用单一 API 调用,快速删除容器的所有子对象。
  • 新的 MovieClip 属性
    • 利用新的 MovieClip.isPlaying 特性,返回 MovieClip 的当前播放状态。
  • Adobe Flash Access®
    • 利用关键旋转支持、V3 许可证链接、域名支持、增强输出保护以及设备过滤功能。

Tags:

Flash技术

Flex中的元数据标签

by 老姜 2011.11.5 08:33

元数据标签是一种特殊的标签,它在代码中的作用就是向编译器提供如何编译程序的信息。
实际上,这些标签并没有被编译到生成的SWF文件中,而只是告诉编译器如何生成SWF 文件。

Flex中的元标签列表如下:

标签 描述
[ArrayElementType("elementType")] 在数组中定义所有允许的数据类型。
[Bindable]
[Bindable(event="eventname")]
声明一个属性可以在代码中使用数据绑定表达式,Bindable可以用来绑定简单数据类型、类、复杂数据类型以及函数。
[DefaultProperty("propertyName")] 定义组件在MXML中使用时的默认属性的名称。
[Deprecated] 标识一个类或类的元素是不推荐使用的,这样编译器能认出他并在被调用时给出一个警告信息。
[Effect] 定义MXML的特效属性名称。
[Embed] 在编译时导入 JPED,PNG,SVG 或 SWF文件。也会导入SWC文件的图片资源。他的功能等同于MXML中的 @Embe 语法。
[Event] 定义MXML的事件属性的名称和类型。
[Exclude] 使 Flex Builder 的标签检查器忽略类元素。语法类似 [Exclude(name="label",     kind="property")]
[ExcludeClass] 是 Flex Builder 标签检查器忽略类。这相当于ASDoc中的 @private 标签。
[IconFile] 定义一个图标文件,使组件在Adobe Flex Builder的插入面板中以该图标显示。
[Inspectable] 定义一个属性的列表,供组件使用者在 Flex     Builder 的的属性提示和标签检查中使用。同时也定义了属性的可用值。
[InstanceType] 指定了 IDeferredInstance 中的,属性接受的数据类型。
[NonCommittingChangeEvent] 定义一个事件过渡触发器。
[RemoteClass] 把一个ActionScript对象映射到Java对象。
[Style] 为组件的样式属性定义一个MXML标签属性。
[Transient] 当一个 ActionScript 对象被映射到Java对象后,被该标签标识的属性,会从发送到服务端的数据中忽略掉。

[ArrayElementType]
实际上,定义一个数组通常来说是一件很平常的事情,因为数组中的元素可以是任何类型的。不过,使用ArrayElementType元数据标签可以让你定义数组元素的数据类型。下面的例子展示了如何使用[ArrayElementType]:

程序代码
   [ArrayElementType("String")]
     public var arrayOfStrings:Array;

     [ArrayElementType("Number")]
     public var arrayOfNumbers:Array;

     [ArrayElementType("mx.core.UIComponent")]
     public var arrayOfUIComponents:Array;

[Bindable]
Bindable元数据标签是最经常用到的一个元数据标签,因为它使程序组件之间的数据同步变得很容易。Bindable可以用来绑定简单数据类型、类、复杂数据类型以及函数。绑定数据的时候,你必须先使用元数据标签定义一下数据,正如Listing 1 中所示的那样。
Bindable也可以用来绑定到事件。Listing 2 展示了如何使用getter和setter函数将一个属性绑定到一个事件上。这个例子中有一个叫做phoneNumber的私有变量,还有一个公有的 setter和getter函数。使用Bindable标签将这个getter方法绑定到了一个叫做phoneNumberChanged的事件上,只要数据发生改变setter方法就会分派phoneNumberChanged事件。通过使用setter方法,可以在数据赋予私有变量之前对其进行操作。在这个例子中,数据只有在长度大于等于10的时候才会被格式化。当phoneNumberChanged事件被分派的时候,第二个TextInput组件会被更新,因为他的text属性绑定到了phoneNumber变量上。
[DefaultProperty]
DefaultProperty元数据标签用来将一个单一属性设定为某个类的默认属性。它允许在一个容器标签内设定属性,而不用定义属性的名字。一个简单的例子就是一个自定义Button类。Listing 3 展示了一个简单的Button类,它将label属性设定为了DefaultProperty。Listing 4 展示了label属性是如何在自定义Button标签中作为一个字符串定义的。
[Embed]
Embed元数据标签用来导入图片到程序。可以通过两种方式使用Embed。你可以将图片嵌入到ActionScript中并将其指派给一个变量(如同下面代码中的第一个例子),或者你也可以将图片直接指派给组件的属性(使用下面代码中的第二个例子所示的语法规则)。
例1:

程序代码
[Embed(source="myIcon.gif")]
[Bindable]
public var myIcon:Class;
<mx:Button label="Icon Button 1" icon="{myIcon}"/>
<mx:Button label="Icon Button 2" icon="{myIcon}"/>

例2:

程序代码
<mx:Button label="Icon Button 1" icon="@Embed(source=myIcon.gif')"/>
<mx:Button label="Icon Button 2" icon="@Embed(source=myIcon.gif')"/>

上面这两个例子产生的结果是一样的。创建myIcon类的好处是,它在一个类中只定义一次并可以绑定到程序中的多个组件。
[Event]
Event元数据标签用来声明那些被自定义类分派的事件。将这个元数据标签添加到类定义中之后,你就可以在MXML标签中添加事件处理函数来初始化该自定义类。Listing 5 创建了一个自定义Button类,每当它的label属性改变的时候就会分派一个事件。Listing 6 所显示的主程序文件初始化了这个自定义Button并创建了事件处理函数,该函数将新的labe属性值赋给了一个TextArea组件以显示当前发生的更改。
[Effect]
Effect元数据标签用来定义一个自定义效果,当某个事件发生的时候该效果会被分派。这个示例可以基于前面Event的例子来创建,通过简单地更改ButtonLabel类(Listing 7 )中的一行代码,就定义了一个效果,该效果可以在MXML标签中直接使用(Listing 8 )。
[IconFile]
IconFile 是用来定义一个jpg,gif或者png文件的文件名的,它在你的自定义类中作为图标来使用。[Embed]元数据标签可以用来嵌入图片、SWF文件、音乐文件以及视频文件等,而IconFile则只是用来嵌入用来作为自定义类图标的文件。下面是一个IconFile的例子:

程序代码
[IconFile("icon.png")]
public class CustomButton extends Button
{

}

[Inspectable]

在使用Flex Builder 2的时候,你可能会希望某些自定义组件的属性在代码提示和属性检查器(property inspector)中显示,Inspectable元数据标签就是用来定义那些属性的。Listing 9 展示的例子定义了一个inspectable的ccType变量,它定义了Visa为默认值、Credit Card为类别并将取值范围定义为包含了Visa, Mastercard, Discover, 和 American Express的枚举。
[InstanceType]
当在一个模板对象中声明一个像IDeferredInstance这样的变量时,InstanceType元数据标签就用来声明对象的类型。下面是InstanceType的用法:

程序代码
[InstanceType("package.className")]

[NonCommittingChangeEvent]
NonCommittingChangeEvent元数据标签在某个特定事件发生的时候可以防止变量在事件发生的过程中被更改。Listing 10 展示了它是如何工作的。一个名为s的字符串类型的私有变量被绑定到了名为ti2的TextInput组件上。另外一个id为ti1的TextInput组件在它的text发生更改的时候就会将s的值设置为它的text属性的值。另外,当triggerBinding 事件被分派的时候,附加在s变量上的Binding元数据标签就会进行绑定。只有在Enter键在ti1 TextInput组件中被按下时才会分派triggerBinding事件。
[RemoteClass]
RemoteClass 可以用来将一个ActionScript类绑定到一个Java类或一个ColdFusion CFC。这样做可以自动转换数据类型。下面的例子将包com.mydomain中的名为MyClass的ActionScript类绑定到了同一个包中名为MyClass的Java类:

程序代码
package com.mydomain {
   [Bindable]
   [RemoteClass(alias="com.mydomain.MyClass")]
   public class MyClass {
     public var id:int;

     public var myText:String;

   }
}

[Style]
Style元数据标签用来为组件定义自定义样式属性的。只需要简单地将Sytle元数据标签添加到类的定义当然,然后就可以使用getSytle方法获取它的值了。Listing 11 和 12 中的例子定义了两个样式,分别为borderColor 和fillColor,它们的数据类型都是uint。当类初始化的时候这两个样式就会在标签中被设定。代码中覆写了updateDisplayList函数,用自定义的样式画了一个圆形边框并将其填充。
现在你应该会有这样的感觉了:“喔,现在我知道在哪里可以使用它们了”或者“嗯,我想我会在新的项目中尝试使用这些元数据标签”。如果你没有,那么你可能需要回过头去再看一遍这篇文章。OK,我想说的是Adobe Flex小组提供给我们的元数据标签不只是非常的强大,可以让我们扩展或自定义我们要做的东西,而且它还非常易于使用。通过使用它们,仅仅几行代码就可以完成一大堆事情。如果不使用这些标签,你会发现在Flex 2中实现一些东西是很辛苦的。

Tags:

Flash技术

AS3设计模式之一:单例模式(Singleton Pattern)

by Administrator 2011.9.29 16:29

原文地址:http://www.cnitblog.com/flashlizi/archive/2007/11/09/33236.html

什么是单例模式?

在面向对象的编程中,有时候会要求一个类有且仅存在一个实例,并提供一个全局的访问方法。所以我们在设计这样的类的时候,就需要思考如何避开构造函数,提供一种机制来实现单例(单一实例)。这就是单例模式。另因为在AS3中无法操作线程,因此我们无需考虑多线程情况下的单例。

单例模式的几种AS3实现

在AS3中有多种方法可以实现Singleton模式,首先看下面的方法1:

 1package {
 2    public class Singleton {
 3        private static  var _instance:Singleton = new Singleton();
 4        public function Singleton() {
 5            if (_instance) {
 6                throw new Error("只能用getInstance()来获取实例");
 7            }

 8        }

 9        public static function getInstance():Singleton {
10            return _instance;
11        }

12    }

13}

此方法通过静态私有变量_instance来创建Singleton类的实例,通过getInstance方法来访问这个单一实例。另外,由于在AS3中不允许private、protected的构造函数,只能是public,因此需要防止用构造函数来创建Singleton类的实例。这个方法有个问题就是这个类的实例会在程序一开始就创建。

方法2:
 1package {
 2    public class Singleton {
 3        private static  var _singleton:Boolean=true;
 4        private static  var _instance:Singleton;
 5        public function Singleton() {
 6            if (_singleton) {
 7                throw new Error("只能用getInstance()来获取实例");
 8            }

 9        }

10        public static function getInstance() {
11            if (!_instance) {
12                _singleton=false;
13                _instance=new Singleton();
14                _singleton=true;
15            }

16            return _instance;
17        }

18    }

19}

此方法通过一个静态私有变量_singleton来控制_instance的创建,保证其唯一性。并且这个方法不存在方法1中的问题,_instance实例只有在调用getInstance()方法后才会创建。

方法3:
 1package {
 2    public class Singleton {
 3        private static  var singleton : Singleton;
 4        public function Singleton( caller : Function = null ) {
 5            if ( caller != hidden ) {
 6                throw new Error("只能用getInstance()来获取实例");
 7            }

 8            if ( Singleton.singleton != null ) {
 9                throw new Error("只能用getInstance()来获取实例");
10            }

11        }

12        public static function getInstance():Singleton {
13            if ( singleton == null ) {
14                singleton = new Singleton( hidden );
15            }

16            return singleton;
17        }

18        private static function hidden():void {
19        }

20    }

21}

此方法通过对构造函数增加参数来控制单个实例的创建。此构造函数只有传入参数为私有方法hidden的时候,才能创建实例。私有方法hidden对外的不可见性保证了单例的实现。

方法4:
 1package {
 2    public class Singleton {
 3        private static  var _instance:Singleton;
 4        public function Singleton(singletoner:Singletoner) {
 5            if (singletoner == null{
 6                throw new Error("只能用getInstance()来获取实例");
 7            }

 8        }

 9        public static function getInstance():Singleton {
10            if (_instance == null{
11                _instance = new Singleton(new Singletoner());
12            }

13            return _instance;
14        }

15    }

16}

17internal class Singletoner {
18}

此方法和方法3相似。这里利用了包外类对外的不可见性(Singletoner类仅在此as文件内可见)来保证单例的实现。

总结

单例模式的实现方式很多,在不同的需求下选择合适的才是最好的。比如方法1虽然一开始就会创建实例,但它不会像其他方法每次调用实例都要检查是否存在类的实例。Singleton模式只考虑实例的创建,而没有考虑到销毁,由垃圾回收机制自行处理。另外,你也可以扩展Singleton模式,比如稍做修改保证一个类只有少数几个实例,来实现一些特殊的目的,这样做也是合理和有意义的。

Tags: , ,

Flash技术

AS3编码规范

by 老姜 2011.4.21 21:07

原文地址:http://artlee.biz/572/comment-page-1#comment-134

作者:Artlee

AS3编码规范

2010年3月10日 Artlee 版本v1

作者根据自己多年的Flash项目开发及管理经验,吸取驼峰命名法与匈牙利命名法的长处,结合MVCS开发模式,融入面向对象的开发思想,并且考虑到业界已有的不成文的约定,兼顾Flash开发以及Flex开发的便利性,草拟了这份AS3编码经验。请各位大师多多指教。

一,基本原则

  1. 约定大于配置,约定大于规范
  2. 规范思想,并非为束缚手脚
  3. 在无歧义的前提下,命名力求简洁
  4. 在语义明了的前提下,命名力求省力,如果可以同时不按shift,则不按
  5. 命名=表义词语+类型,名称表义为先
  6. 坚持使用强类型
  7. 把常用的成员,放在容易找到的地方,给予它们更大的访问权限
  8. 源码格式以清晰易读为准
  9. 注释大于代码,代码总是与注释有关的

二,一般规则

  1. 文件组织结构与包(在MVCS开发模式下)范式:(companyDomain|teamName).projectName

    +controllers 控制器目录

    +events 事件目录

    +managers 管理器目录

    +models 数据模型目录

    +models.vos VO对象目录

    +services 数据服务目录

    +views 视图目录

    +views.uis UI目录

    +utils 工具类目录

    +Module_{Name}.as 模块类(IFacade)

    说明:|表示或者,两者取其一

    词性:名词

    命名:驼峰命名法,第一个单词首字母小写,第二个单词首字母大宇,因形似驼峰而得名

  2. 类与类文件范式:SealedName[Type]

    说明:若无歧义,[]之内可略去,以下同

    如PopUpManager、MouseEvent、StringUtil、FishController等

    在MVC开发模式下,如果去掉Type,在项目中则可能出现同名文件,虽然完全限定名不同,但同时在同一个类中被引入时,会给编码带来不便。在这种情况下,保留Type更为合理。

    词性:名词

    命名:大驼峰命名法(首单词首字母大写)

  3. 接口范式:ISealedName[Type]

    说明:接口与类相比,不同之处仅在于附有前缀I

    词性:字母I+名词

    命名:大驼峰命名法(首单词首字母大写)

  4. 常量范式:CONST_VARIABLE_NAME = “constVariableName”

    命名:常量名称单词大宇,间以下划线,常量值使用驼峰命名法

    词性:名词、动名词等

    用途:在事件类中定义事件类型,在枚举类中定义枚举值等

  5. 实例变量、参数变量、函数变量与类静态变量范式:variableName

    命名:驼峰命名法

  6. 函数范式:[varName_]getMethodName(argName1 :String…)

    命名:驼峰命名法

    词性:动词、动名词

  7. 命名空间范式:lib_internal

    命名:小写字母单词,间以下划线

    词性:名词+形容词

  8. 类成员的位置成员优先级从高到低:常量,静态变量,静态函数,构造器,实例变量,getter/setter属性存取器,函数

    同级别的成员按访问修饰符排序:public,internal,protected,private

三,具体细则

  1. 在参数变量、函数变量中常用的缩写c : Controller(或ctrl)

    m: Model

    v:View

    e : Event or Error

    mdl: Module

    ui: UI

    srv: Service

    btn:Button

    mc:MovieClip

    spt:Sprite

    n:Num

    j,k,m,n: for循环数字标识

  2. 在MVCS开发模式下,常用的Type后缀视图:View

    视图接口:IView

    控制器:Controller

    数据模型:Model

    数据对象:VO

    UI:UI

    管理器:Manager

    事件集:Events

    事件:Event

    枚举类:*s(在类名加复数s)

    数据服务:Service

    工具类:Util

    模块:Module

    基类:Base

  3. 事件句柄函数命名举例onClick(e :MouseEvent) :void

    btnClose_onClick(e:MouseEvent) :void

    mouseEventHandler(e :MouseEvent) :void

    mcName_mouseEventHandler(e :MouseEvent) :void

  4. 颜色变量使用uint
  5. 时间变量使用Number
  6. switch多在事件句柄函数中使用
  7. 优先使用Vector,在声明数组Array时,标明它的元素类型,如fishs : Array /* Element Of Fish */
  8. 避免使用try..catch
  9. 在for循环中,使用j、k、m、n作为循环数字
  10. 不要声明没有类型的变量,不要使用*使用类型修饰符,避免返回类型为Object的对象
  11. 不用使用Object作为HashMap,使用Dictionary代替
  12. 基本弃用private,默认非公开的实例变量与实例函数使用protected访问修饰符
  13. 在VO类中,默认所有变量使用基元类型作为类型修饰符,使用public作为访问修饰符
  14. 基本弃用getter/setter,在一般情况下,不使用public的getter/setter存取器,代替以public getMethod/setMethod。
  15. 把花括号放在同一列,如:public getMehtod() : void

    {

    }

  16. 在类、函数上使用ASDoc注释,如:/**

    * comment

    */

  17. 不使用下划线作为变量前缀。
  18. 以Flash制作资源文件时:元件成员分层放置,每层须有名称

    库元件分目录放置,以类别组织文件夹

    元件的实例名称使用驼峰命名法,命名规则与实例变量同

    元件的导出名称与所要绑定的类名一致

    Label与AS均单独放在一层里,置于最上面

    避免使用mask

    尽量不要使用滤镜

  19. 控制显示对象的位置时,避免使用小数
  20. 修改fla文件之前要签出、锁定,再修改。
  21. 使用空白字符使代码明晰易读,如:在单词、符号之间使用空格

    在函数、变量之间使用空行

    在包、类、函数、匿名函数各级别间使用缩进

    如果参数列表过长,或数组元素很多,可以拆行,使用相同缩进

  22. 在导入类时,避免使用*号
  23. 约定在注释中添加fixed标签的类或函数,不要随意更改
  24. 函数变量在函数顶部统一声明,在事件函数内部移除事件监听统一放在函数顶部
  25. 在类的顶部写上该类的功能注释,1234,条列清楚,这个类有什么功能均是与此注释有关的。
  26. 不使用for(key:String in Array)的方式迭代数组
  27. 使用[]实例化数组,而非new Array()

Tags:

Flash技术

ScaleBitmap : New version by Didier Brun

by 老姜 2011.4.21 18:31

原文地址:http://www.bytearray.org/?p=1206

Let me introduce the new version of ScaleBitmap :

ScaleBitmap V2 Illustration

I have totally rewritten ScaleBitmap to suit my needs :

  • Better usage of memory : no more creation of BitmapData instance (possibility to swap BitmapData)
  • Outer drawing capability
  • ScaleBitmapSprite

    The outer drawing & ScaleBitmapSprite allows you to :

  • Easily deal with shadow, glow, overlapping icon effects
  • Use real size & position to align or place your elements

    Usage 1 : ScaleBitmap

    1.ScaleBitmap.draw(
    2.bitmap : BitmapData, // the bitmap source
    3.graphic:Graphics, // the destination graphic
    4.width:Number, // width (defined by outer rectangle if not null)
    5.height:Number, // height (defined by outer rectangle if not null)
    6.inner : Rectangle, // inner rectangle for scale 9
    7.outer : Rectangle=null // outer rectangle : visual size reference
    8.):void

    If outer is not null, ScaleBitmap use a negative offset for drawing (according to outer properties)
    If outer is null, ScaleBitmap works as a classic Scale9 grid drawer

    Usage 2 : ScaleBitmapSprite

    01.ScaleBitmapSprite(
    02.bitmap : BitmapData, // the bitmap source
    03.inner : Rectangle, // inner rectangle for scale 9
    04.outer : Rectangle=null) // outer rectangle : visual size reference
    05.  
    06.var s:ScaleBitmapSprite=new ScaleBitmapSprite(mySkin, new Rectangle(20,20,80,20), new Rectangle(15,15,90,30));
    07.addChild(s);
    08.s.width=80;
    09.s.height=40;&lt;/a&gt;

    ScaleBitmapSprite override public size setter & getter : you can move & resize a ScaleBitmapSprite object without taking care of bitmap outer drawing.

    Simple MyButton class using ScaleBitmapSprite (click the button) :


    Sources FCS4 [ require Eaze to compile]

    Download ScaleBitmap & ScaleBitmapSprite :
    Repository : http://gist.github.com/264250

    Some of you prefer gist, so as possible, I will share my new projects via gist.

    Hope this class help & merry Xmas to bytearray readers.

    [EDIT 2010-05-18]

    A new version 1.1 is available !

    Jerôme Decoster, a talented french developer have made a lot of improvements in this new version :

    • smooth support
    • invalidation for ScaleBitmapSprite
    • code optimization
    • inner drawing correction

    So many thanks to you Jerôme :)

    Repository : http://gist.github.com/264250

  • Tags:

    Flash技术

    可用ActiveSWF动态生成swf文件

    by 老姜 2011.4.21 17:50

    ActiveSWF专为网络开发者和Flash动画专业人员设计的软件,用户可以很容易的计划该组件以营造Flash动画,

    支持语音、图像压缩方法,

    支持GIF, JPEG, PNG, BMP, TIFF, WMF 等格式(zsh)。

    Build advanced Flash applications
    on ActiveSWF platform

    ActiveSWF is innovative rich media platform specially designed for web developers and Flash professionals building applications for Windows and .NET.

    ActiveSWF generates Flash content dynamically and can be easily programmed to build Flash movies from XML. Being compatible with most of Windows oriented technologies including COM and .NET ActiveSWF SDK opens the world of Flash for millions of VisualBasic, C# and Visual C++ developers.

    How ActiveSWF works

    How ActiveSWF works diagram

    Features

    ActiveSWF supports all basic Flash graphical primitives, animations and scripting. Audio and image compression methods allow to significantly reduce movie size with minimum quality loss.

    • Basic shape types: ellipses, circles, rectangles, squares, polygons
    • Shape fills: solid, bitmap, radial and linear gradients
    • Shape masks
    • Image elements loaded from GIF, JPEG, PNG, BMP, TIFF, WMF source formats
    • Plain text and HTML text elements
    • Font embedding
    • Buttons
    • Sprites
    • Streaming and event audio
    • Object moving and resizing
    • Color & transparency management
    • Clipping objects
    • Shape tweening
    • Audio size optimization
    • Image size optimization
    • WMF vector graphics conversion to Flash
    • ActionScript 2.0 compilation
    • Video new

    http://www.activeswf.com/

    Tags: , ,

    Flash技术

    【翻译】我是AGAL,来自Adobe——(一)

    by 老姜 2011.4.12 09:33

     

    【翻译】我是AGAL,来自Adobe——(一) 

    本文原址:http://www.panovr.org/

    英文原址:http://iflash3d.com/shaders/my-name-is-agal-i-come-from-adobe-1/

    试想有一天,人类灭亡。 

    试想在我们灭亡之后,所有纸质文档随着时间的推移,变得破旧且不能识别。 

    试想外星人找到了人类那些存储着有关人类信息的DVD或固态存储器。

    他们将如何破译它?如何找到解读隐藏在这些“神器”中信息的密钥?

    如果他们获取了我们的技术成果,他们如何能够真正理解我们的发现、使用我们的技术,是否他们需要这些技术自我解读呢?

    Adobe最近推出了一种称为AGAL的新语言(Adobe Graphics Assembly Language)。它是Molehill的部件,其目的是为创建所谓的“着色器(shahers)”:影响三维模型在场景中如何渲染的微小程序。

    这些着色器很酷,有着惊人的渲染效果,编写代码也比常规的AS更难。

    AGAL看起来像这样:

    //vertex shader  顶点着色器

    m44 op, va0, vc0 // pos to clipspace

    mov v0, va1 // copy uv

     

    //pixel shader  像素着色器

    tex ft1, v0, fs0 <2d,linear,nomip>

    mov oc, ft1

    是不是看着像天书?那使用它的关键是什么?

    问题是现阶段AGAL的相关文档还很少。我来试着讲解这种神秘的着色语言。

    The OpCode 操作码 

    着色器的每一行是一个由被称为“操作码(opcode)”的3个字符的字符串指定的命令行。

    AGAL的代码语法如下:

    <opcode> <destination> <source 1> <source 2 or sampler>

    <操作码>  <目标>  <来源1>  <来源2或样例>

    这很关键。记住此语法AGAL就不再像是一个不可读的二进制字符串了。

    在操作码之后,根据该命令还可以有目标,以及一个或两个来源。目标和来源是“寄存器”:即供着色器使用的小块GPU内存区(以下更多的寄存器)。 

     

    AGAL有大约30种不同功能的操作码。在Molehill的文档中有操作码的完整列表。下面是一些最常见的操作码。

    • mov move data from source1 to destination, component-wise
    • add destination = source1 + source2, component-wise
    • sub destination = source1 – source2, component-wise
    • mul destination = source1 * source2, component-wise
    • div destination = source1 / source2, component-wise
    • dp3 dot product (3 components) between source1 and source2
    • dp4 dot product (4 components) between source1 and source2
    • m44 multiplication between 4 components vector in source1 and 4×4 matrix in source2
    • tex texture sample. Load from texture at source2 at coordinates source1.

    AGAL Registers 寄存器

    寄存器是GPU中的小块内存区域,供AGAL程序(着色器)执行时使用。寄存器即可用于AGAL命令的来源,也可用于目标。

    你也可通过寄存器向着色器传递参数。

    每个寄存器为128位,能包含4个浮点数值。每一个值被称为寄存器的组件。

    寄存器组件可以通过“坐标”存取器(xyzw)和色彩存取器(rgba)存取。

    所以,寄存器的第一个组件,既可以存取:

    <register name>.x

    也可以存取:

    <register name>.r

    上面的一些操作码,像“add”,执行他们的操作“智能组件”。意味着加法操作是按组件到组件执行的。

    这是6个可用的寄存器类型。

    1. Attribute Registers  属性寄存器

    这些寄存器涉及顶点着色器的输入VertexBuffer。因此,他们只可用在顶点着色器。

    为了指派一个VertexBuffer指定的属性寄存器,在这个函数中使用正确的索引号Context3D::setVertexBufferAt()

    从着色器中访问该属性寄存器的语法:va<n>,其中<n>是属性寄存器的索引号。

    总共有8个用于顶点着色器的属性寄存器。

    2. Constant Registers 常量寄存器

    这些寄存器是为了从ActionScript传递参数到着色器。通过Context3D::setProgramConstants()函数完成。

    从着色器中访问这些寄存器的语法:vc<n>,用于顶点着色器,fc<n>用于像素着色器,其中<n>是常量寄存器的索引号。

    128个用于顶点着色器和28个用于像素着色器的常量寄存器。

    3. Temporary Registers  临时寄存器

    这些寄存器供着色器在临时计算时使用。
    访问它们的语法:vt<n>(点)和 ft<n> (像素),其中<n>是寄存器的序号。

    8个可用于顶点着色器,8个可用于像素着色器。

    4. Output Registers 输出寄存器

    输出寄存器存储顶点和像素着色器的计算输出。对于顶点着色器是一个顶点剪辑空间的位置。对于像素着色器是该像素的颜色。
    访问这些寄存器的语法:op,用于顶点着色器,oc,用于像素着色器。

    显然只有一个用于顶点和像素着色器的输出寄存器。

    5. Varying Registers 变量寄存器

    这些寄存器用来从顶点着色器向像素着色器传递数据。

     

    这些寄存器用来传递从顶点​​着色器到像素着色器的数据。所传数据被GPU转换,从而使像素着色器接收到正确的值,用于正在处理的像素。

    用这种方法传递的典型数据是顶点的颜色或纹理的UV坐标。

    访问这些寄存器的语法:v<n>,其中<n>是寄存器序号。
    8个变量寄存器可用。

    6. Texture Samplers  纹理采样寄存器

    纹理采样寄存器是用来接收从基于UV坐标系的纹理中的颜色值。
    纹理的指定通过ActionScript使用方法 Context3D::setTextureAt()。
    纹理采样的使用语法是:ft<n> <flags>,其中<n>是采样序号,<flags>是一个或多个用于指定应如何取样的标志集。

    <flags>是一个以逗号分隔的字符串集,其定义是:

    • 纹理维度。可以是:2d, 3d, cube
    • 多重材质映射。可以是:nomip, mipnone, mipnearest, mipnone
    • 纹理滤镜。可以是:nearest, linear
    • 重复纹理。可以是:repeat, wrap, clamp.

    好了,举例来说,一个标准的没有多重材质映射的2D纹理,进行线性滤镜采样到临时寄存器ft1中,用下行:

    “tex ft1, v0, fs0 <2d,linear,nomip> “

    其中变量寄存器v0保存以内插值替换的纹理UV坐标。

    顶点和像素着色器例子解释

    现在我们返回到着色器的例子,并解释其运作。

    我们假设顶点在VertexBuffer中包含着顶点的位置,偏移量是0,纹理的UV偏移量是3
    我们希望我们的顶点着色器转换顶点位置到剪辑空间里,并传递UV到像素着色器。
    执行以下代码:

    m44 op, va0, vc0 // pos to clipspace

    mov v0, va1 // copy uv

    第一行执行了在输入顶点,va0,和从模型空间到剪辑空间的变换矩阵之间的4×4矩阵乘法,我们假定已从ActionScript写入到常量寄存器0中,vc0
    用下面的方法可将此矩阵写入到着色器:

    Context3D::setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, matrix, true );

     

    着色器的第二行,复制顶点UV数据到变量寄存器0V0,因此,它可以获得修正,并传递到像素着色器。
    像素着色器采样纹理,并复制颜色到输出寄存器。

    tex ft1, v0, fs0 <2d,linear,nomip>

    mov oc, ft1

    好了,这个顶点/像素着色器刚刚将三维模型转换到二维屏幕上,并进行了纹理映射。
    这就是我们的第一个顶点和像素着色器!

    真酷!那我现在可以制作一个着色器吗?

    还不行!
    其实,你可以制作着色器,但是无法使用,因为我们仍然会在Actionscript 一面失败的。
    教程的第二部分,我会深入到让ActionScript必须使用我们的着色器并提供完整的演示代码。
    我希望本教程对您有所帮助如果是这样,发表您的评论
    敬请关注

     

    Tags: , , , ,

    Flash技术

    FLV文件格式

    by 老姜 2011.3.15 13:58

    本文部分摘自: http://blog.sina.com.cn/s/blog_48f93b530100eyoe.html

    参考了Adobe 官方的 <Video File Format Specification Version 9>. 这个格式文档不但包括 FLV 格式说明, 还包括 F4V 格式说明.

     FLV是流媒体封装格式,可将其数据看为二进制字节流,其字节编码格式为 BigEndianUnicode 。总体上看,FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag及Tag Size对组成。因此一个FLV文件看上去是下面的结构:

     

    其中,Previous Tag Size紧跟在每个Tag之后,占4个字节表示一个UI32类型的数值,表示前面一个Tag的大小。需要注意的是,Previous Tag Size #0的值总是为0Tag类型包括视频、音频和Script,且每个Tag只能包含一种类型的数据。下面我们看看File HeaderTag的具体结构,为了方便大家理解,我贴一个实际FLV文件的字节流图片,图片中把不同部分区分了颜色。

     

      一、File Header结构

        File Header的长度和结构是固定的,在当前版本中总是由9个字节组成,如图中蓝色区域所示。
        第1-3字节为文件标识(Signature),总为“FLV”(0x46 0x4C 0x56),如图中紫色区域。
        第4字节为版本,目前为1(0x01)。
        第5个字节的前5位保留,必须为0。
        第5个字节的第6位表示是否存在音频Tag。
        第5个字节的第7位保留,必须为0。
        第5个字节的第8位表示是否存在视频Tag。
        第6-9个字节为UI32类型的值,表示从File Header开始到File Body开始的字节数,版本1中总为9。

     

    二、Previous Tag Size结构

        如图中红色位置所示。

    三、Tag结构

        Tag包括Tag Header和Tag Data两部分。不同类型的Tag的Header结构是相同的,但是Data结构各不相同。如图中绿色和黄色区域分别表示Tag Header数据和Tag Data数据。

        当前版本的Tag Header结构占用11个字节。
        第1个字节表示Tag类型,包括音频(0x08)、视频(0x09)和script data(0x12),其他类型值被保留。
        第2-4字节为UI24类型的值,表示该Tag Data部分的大小。
        第5-7字节为UI24类型的值,表示该Tag的时间戳(单位为ms),第一个Tag的时间戳总是0。
        第8个字节为时间戳的扩展字节,当24位数值不够时,该字节作为最高位将时间戳扩展为32位值。
        第9-11字节为UI24类型的值,表示stream id,总是0。

    字段名称类型说明
    TagType UI8

    本TAG的类型. 可取值:

    • 8: audio
    • 9: video
    • 18: script data
    • 其他的: 保留
    DataSize UI24 Data字段的数据长度
    Timestamp UI24 无用?
    TimestampExtended UI8 对上面的字段扩展之用
    StreamID UI24 总是 0
    Data
    • If TagType = 8
      AUDIODATA
    • If TagType = 9
      VIDEODATA
    • If TagType = 18
      SCRIPTDATAOBJECT
    TAG 数据字段, 主要的数据就在这个里面. 本字段的数据类型取决与TagType内的值

        后面的字节为Tag Data数据,Data的大小由第2-4字节的数值指示,根据第1个字节指示的Tag类型,按照不同的结构解析Tag Data。下面分别介绍。

     

    四、Audio Tag Data结构

        音频Tag开始的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。
        第1个字节的前4位的数值表示了音频数据格式,各值代表的意义大家可以查阅Adobe公司发布的FLV格式说明文档(可以到我的磁盘空间的“资料”目录去下载 http://e.ys168.com/?tinyfun)。
        第1个字节的第5-6位的数值表示采样率,0 = 5.5 kHz,1 = 11 kHz,2 = 22 kHz,3 = 44 kHz。
        第1个字节的第7位表示采样精度,0 = 8bits,1 = 16bits。
        第1个字节的第8位表示音频类型,0 = mono,1 = stereo。

    字段称类型说明
    SoundFormat UB[4]

    0 = Linear PCM, platform endian
    1 = ADPCM
    2 = MP3
    3 = Linear PCM, little endian
    4 = Nellymoser 16-kHz mono
    5 = Nellymoser 8-kHz mono
    6 = Nellymoser
    7 = G.711 A-law logarithmic PCM
    8 = G.711 mu-law logarithmic PCM
    9 = reserved
    10 = AAC
    14 = MP3 8-Khz
    15 = Device-specific sound

    SoundData 字段内音频的存储格式

    格式7, 8, 14, 15 保留专用

    格式10 (AAC) 只有在 Flash Player 9.0.115.0 及以上版本提供.

    这里只关心 MP3 格式的, 因为其他编号的还不确定咋样处理.

    SoundRate UB[2]
    0 = 5.5-kHz
    1 = 11-kHz
    2 = 22-kHz
    3 = 44-kHz

    取样率 对AAC格式: 总为 3

    SoundSize

    UB[1]
    0 = snd8Bit 8位
    1 = snd16Bit 16位

    每个取样的大小
    对AAC格式: 总为 1

    实际本字段为一个逻辑类型字段

    SoundType

    UB[1]
    0 = sndMono 单声道
    1 = sndStereo 立体声

    标示是 立体或单声道的声音
    对于Nellymoser格式: 总为 0
    对于AAC格式: 总为 1

    本字段也可以理解为逻辑类型字段

    SoundData UI8[sound data长度]

    如果 SoundFormat 字段为 10
    本数据为 AACAUDIODATA 类型的音频数据(本文忽略处理)
    否则为实际的音频数据

    对于MP3格式的音频数据直接将本字段的数据当成MP3数据来处理

     

    五、Video Tag Data结构

        视频Tag也用开始的第1个字节包含视频数据的参数信息,从第2个字节开始为视频流数据。
        第1个字节的前4位的数值表示帧类型。
        第1个字节的后4位的数值表示视频编码ID,1 = JPEG(现已不用),2 = Sorenson H.263,3 = Screen video,4 = On2 VP6,5 = On2 VP6 with alpha channel,6 = Screen video version 2。 

    六、Script Tag Data结构

        该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的参数信息,如duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。

        一般来说,该Tag Data结构包含两个AMF包。AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述。第一个AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。第二个AMF包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。具体说明如下,大家可以参照图片上的数据进行理解。

         第一个AMF包:

           第1个字节表示AMF包类型,一般总是0x02,表示字符串,其他值表示意义请查阅文档。
           第2-3个字节为UI16类型值,表示字符串的长度,一般总是0x000A(“onMetaData”长度)。
           后面字节为字符串数据,一般总为“onMetaData”。

     

        第二个AMF包:

           第1个字节表示AMF包类型,一般总是0x08,表示数组。
           第2-5个字节为UI32类型值,表示数组元素的个数。
           后面即为各数组元素的封装,数组元素为元素名称和值组成的对。表示方法如下:
           第1-2个字节表示元素名称的长度,假设为L。
           后面跟着为长度为L的字符串。
           第L+3个字节表示元素值的类型。
           后面跟着为对应值,占用字节数取决于值的类型。

     

    Tags: ,

    Flash技术

    haXe开发者已可以用OOP的语法写Molehill API应用

    by 老姜 2011.3.4 22:08

    本文转自9ria.com, 原文地址:http://bbs.9ria.com/viewthread.php?tid=75034

    一个不算太新的新闻,haXe的主开发者Nicolas Cannasse于2月28日发布了一个叫做HxSL的语言,全名是haXe Shader Language,专门用于开发基于Flashplayer 11中Molehill API的3D应用。这种语言采用ECMAScript兼容的语法,并拥有较高的编译后效率。在很大程度上简化了3D应用的开发效率。

    http://haxe.org/doc/advanced/flash3d 可以看到一些使用的例子,还是有一些晦涩难懂,但毕竟比下面这种形式要容易理解多了:

    var shader : String =
        "dp4 op.x, va0, vc0    \n" +
        "dp4 op.y, va0, vc1    \n" +
        "dp4 op.z, va0, vc2    \n" +
        "dp4 op.w, va0, vc3    \n" +
        "mov v0, va1.xyzw      \n";

    http://haxe.org/manual/hxsl 有完整的HxSL语言手册。

    Tags: , ,

    Flash技术

    关于博主

    我很想写点什么来让你了解我...

    归档

    页面

    最近的文章

    声明

    本博所有网友评论不代表本博立场,版权归其作者所有。

    © Copyright 2011