ActionScript

ActionScript是原Macromedia公司（后并入Adobe）为其Flash产品开发的一种基于ECMAScript的面向对象编程语言。ActionScript可用于网页制作、Adobe Flash动画和Adobe AIR应用程序的开发。

ActionScript和JavaScript均基于ECMAScript语法，因而拥有类似的语法。理论上它们互相可以很流畅地从一种语言翻译到另一种。不过JavaScript的文档对象模型是以浏览器窗口、文档和表单为主的，ActionScript的文档对象模型则以SWF格式动画为主，可包括动画、音频、文字和事件处理。

ActionScript 开发时可借由导入 ANE 作为跨平台使用；并且官方公布之认证Starling （基于OPGL协定）开放框架，可使用GPU高速绘图，而非传统的CPU运算功能。

## 历史

ActionScript 首次出现于Flash 5并实现了在Flash内编程。这个版本被命名为ActionScript 1.0。Flash 6通过增加大量的内置函数和对动画元素更好的编程控制更进一步增强了编程环境的功能。Flash 7（MX 2004）引进了ActionScript 2.0，它增加了强类型和面向对象特征，如显式类声明、继承、接口和严格数据类型。ActionScript 1.0 和 2.0 使用相同的编译形式编译成Flash SWF文件。

### 播放器发展时间表

版本｜发布日期｜描述

Flash Player 2｜1997/06/17｜第一个支持脚本的版本，包括控制时间轴的gotoAndPlay、 gotoAndStop、nextFrame和nextScene等方法。

Flash Player 3｜1998/05/31｜增强了载入外部SWF文件的基本脚本支持（loadMovie）。

Flash Player 4｜1999/06/15｜第一个完全实现脚本功能（称为“动作”）的播放器。这些脚本拥有简练的语法和对循环、条件、变量和其它基本语言结构的支持。

Flash Player 5｜2000/08/24｜第一个拥有真正意义上的ActionScript的版本。依据ECMAScript，采用基于原型编程，并允许完全的过程式编程和面向对象编程。

Flash Player 6｜2002/03/15｜增加了事件处理模型，并且支持switch。

Flash Player 7｜2003/09/10｜提供一些新特性，如支持CSS显示文本和增强显示效果。Macromedia Flash编译器和Flash Player 7同时支持基于ECMAScript 4 Netscape Proposal的类编程语言ActionScript 2.0。不过ActionScript 2.0能交叉编译成ActionScript 1.0的字节码，因此它能运行于Flash Player 6。

Flash Player 8｜2005/09/13｜增加用于运行时图象数据控制和文件上传的新类库及APIs，ActionScript 2.0功能更为完善。

Flash Player 9｜2006/06/22｜原称为Flash Player 8.5，增加ActionScript 3.0和一个称为AVM2（ActionScript Virtual Machine 2）新的虚拟机，它可以与前版本AVM1共存以便支持旧内容。增强性能是该版本的主要目标。这是adobe收购Macromedia后的第一个版本，并且也是Mac OS X上第一个Universal版本的Flash Player。

Flash Player 10｜2008/10/15｜支援多线程。

Flash Player 11｜2011/10/04｜运用Stage3D API提供的硬件加速图像渲染，支援GPU加速。

Flash Player 14｜2014/06/10｜支援AGAL2

Flash Player 17.0.0.93（阅览版 (Beta)）｜2015/03/12｜、支持64位元PC全平台、Flash Player 17.0.0.171（正式版）

Flash Player 18（阅览版 (Beta)）｜2015/06/09｜、支持PC浏览器优化、支持3D支援持续扩充

Flash Player 19｜2015/09/21

Flash Player 20｜2015/12/08｜增强视讯处理和资讯防盗功能

Flash Player 21｜2016/03/10｜、针对FLASH 与 HTML5结合运用 完善相关API、与火狐团队合作 并针对火狐特殊需求增加支援、GPU渲染 3D 内存处理、强化MAC平台支援

Flash Player 22｜2016/06/16｜、处理字典讯息问题、XML 修正、PPAPI 印刷修正、针对Chrome浏览器修正横向模式、大空字符修正、新增 EnableLocalAppData 作为安全性功能提供、与 Google 合作修正视讯路线处理

### 桌面+APP时间表

- 2007年3月19日：发布AIR public preview（当时称Apollo）及软件开发工具包（SDK）。
- 2007年6月10日：Apollo更名为AIR及发布AIR Public beta。
- 2007年10月1日：发布AIR Public beta 2。
- 2007年12月12日：发布AIR Public beta 3。
- 2008年2月25日：发布AIR 1.0版本。
- 2008年6月17日：发布AIR 1.1版本。
- 2008年11月17日：发布AIR 1.5版本。
- 2009年2月24日：发布AIR 1.5.1版本。
- 2009年7月30日：发布AIR 1.5.2版本。
- 2009年12月8日：发布AIR 1.5.3版本。
- 2010年6月10日：发布AIR 2.0版本。
- 2010年10月24日：发布AIR 2.5版本。
- 2011年2月24日：发布AIR 2.6版本。
- 2011年6月14日：发布AIR 2.7版本。
- 2011年10月3日：发布AIR 3.0版本。
- 2011年11月11日：发布AIR 3.1版本。
- 2012年3月28日：发布AIR 3.2版本。
- 2012年6月5日：发布AIR 3.3版本。
- 2012年8月21日：发布AIR 3.4版本。
- 2012年11月6日：发布AIR 3.5版本。
- 2013年2月12日：发布AIR 3.6版本。
- 2013年4月9日：发布AIR 3.7版本。
- 2013年7月24日：发布AIR 3.8版本。
- 2013年10月8日：发布AIR 3.9版本。
- 2013年10月30日：发布AIR 4.0版本。
- 2014年4月8日：发布AIR 13.0版本。
- 2014年6月10日：发布AIR 14.0版本。
- 2014年9月9日：发布AIR 15.0版本。
- 2014年11月11日：发布AIR 16.0版本（Beta），全面支援win8 64位元 /android 5.0 /ios 8。
- 2015年1月22日：发布AIR 16.0版本（正式版），全面支援win8 64位元 /android 5.0 /ios 8。
- 2015年2月4日：发布AIR 17.0版本（Beta），强化支援3D特效与其他视讯效果，并优化效率。
- 2015年4月14日：发布AIR 17.0.0.171版本（正式版）。
- 2015年4月22日：发布AIR 18.0版本（Beta），3D功能扩充，优化IOS效率20%。
- 2015年5月13日：开源团队开启支援linux ubuntu计划。
- 2015年7月8日：发布AIR 18.0版本。
- 2015年9月21日：发布AIR 19.0版本，增加安全性和增加IOS支援。
- 2015年11月18日：发布AIR 20.0（Beta）版本。增加android TV 等跨平台 TV 支援技术研发。
- 2016年6月16日：发布AIR 21.0版本。强化视讯和摄影机路线规划、高清处理、效能优化和移动平台相关开发。

## 语言

### 语法

在ActionScript 2.0里，函式馆物件（如影片片段、按钮）可与类联系在一起。类可写在外在文件档案内，并且这些文件必须有.as后缀。类是增设部分──对ActionScript语言来说，可让程式员自行开发，虽然有许多内建类譬如MovieClip类──可被用来动态地在萤幕上画出向量──已经满足需求了。类档案可使编程更加容易，并且类档案如果需要的话可在许多专案间转移。

Flash ActionScript实现的特点如下，JavaScript程式员也许感兴趣：

- 一切设计是异步的；回调函数是普遍存在的，但事件对象不存在。
- XML的实现从Flash 5便存在了。Flash可送和收XML，该项功能可用来透过网络服务器创造网上多玩者游戏。

ActionScript代码常常直接写在Flash开发环境。该环境提供参考、代码提示和句法强调。原代码常常与电影一起存在.fla档案里。自外部文件档透过#include语法导入ActionScript代码也相当常见。在这种情况下，外部档案也许被Flash整合开发环境内建编译器，或Motion Twin ActionScript2编译器（MTASC）编译。

## 示例

### ActionScript 2.0样本

下面打印Hello World。值得注意的是这只能在整合环境下执行，因为trace函式只有支援整合环境。

```actionscript
trace("Hello world!");
```

下面代码利用onMouseMove事件当鼠标移动时输出现行鼠标位置。同样的这只有在整合环境下执行。

```actionscript
onMouseMove = function () {
   trace("X: "+_root._xmouse);
   trace("Y: "+_root._ymouse);
};
```

这个较先进的范例创造一个包括数字与字串的阵列，并利用原形函式（prototype function）与函式递归给变数名`num`指定一个数，给变数`str`指定一个字串。然后，利用MovieClip应用程序界面，文字区域被显示在屏幕上，文字区域里头写入了变数值。

```actionscript
var my_Array:Array = new Array("Hello", "ActionScript", 3, 7, 11, "Flash");
Array.prototype.pickNumber = function():Number  {
   var rand:Number = random(this.length);
   return (typeof (this[rand]) == "number") ? this[rand] : this.pickNumber();
};
Array.prototype.pickString = function():String  {
   var rand:Number = random(this.length);
   return (typeof (this[rand]) == "string") ? this[rand] : this.pickString();
};
var num:Number = my_Array.pickNumber();
var str:String = my_Array.pickString();
_root.createTextField("txt", 1, 10, 10, 530, 390);
txt.text = "Array = "+my_Array+"\nRandom Number = "+num+"\nRandom String = "+str;
```

### ActionScript 3.0样本

下面先进的Hello World程序目前需要在Flex 2.0公开Alpha测试版整合环境中编译。

```actionscript
package {
   import flash.text.TextField;
   import flash.display.MovieClip;
   import flash.filters.DropShadowFilter;
   public class HelloWorld extends MovieClip {
      public function HelloWorld() {
         var shad:DropShadowFilter = new DropShadowFilter(2, 45, 0x000000, 25, 3, 3, 2, 2);
         var txt:TextField = new TextField();
         txt.textColor = 0xFFFFFF;
         txt.filters = [shad];
         txt.width = 120;
         txt.x = Math.random()*300;
         txt.y = Math.random()*300;
         txt.selectable = false;
         txt.text = "Hello World! ["+Math.round(txt.x)+","+Math.round(txt.y)+"]";
         addChild(txt);
      }
   }
}
//-----ActionScript3.0-----------------
//as3.0最重要的概念就是在效能方面的增進，平時所加入的任何事件都可以被監聽或從記憶體中移除
//以下例子就是監聽與移除記憶體占用，這是as3.0最重要的基礎概念

bt1.addEventListener(MouseEvent.CLICK,bt1_click);

function bt1_click(e:MouseEvent):void{
//觸發的事件內容;
}

//該按紐監聽不需要時則remove掉，增加效能
bt1.removeEventListener(MouseEvent.CLICK,bt1_click);
```

### Starling GPU 开发样本

导入 SWC 或相关 SDK 以后，在建构子内加入以下这段，便可启用 GPU 高速框架开发相关 swf 或是跨平台软件。

```actionscript
var _starling = new Starling(MainGame, stage);
_starling.start();
```

## 外部链接

- 官方 API
- Macromedia实验室- Macromedia发展中技术资源站（英）

## 基本资料

- 编程范型：多重编程范式：基于原型的物件导向程式设计、函数程式语言、指令式编程、脚本语言
- 发行时间：1998年
- 设计者：Gary Grossman
- 开发者：Adobe Systems
- 软件版本周期：3.0
- 类型系统：强型别、静态型别
- 软件实现：Adobe Flash、Adobe Animate、Apache Flex
- 操作系统：跨平台
- 受影响于：JavaScript、Java