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