【摘 要】
  該教程詳細介紹了使用ActionScript編寫腳本時應遵循的基本語法規則,是AS初學者的必讀教程……。

使用ActionScript編寫腳本時,如果使用正常模式的動作面板,通過菜單和列表選擇選項,可以創建簡單的動作。要想用ActionScript編寫功能強大的腳本,你就必須深入了解和學習Flash MX的ActionScript腳本語言。

  像其它腳本語言一樣,ActionScript也有變量、函數、對象、操作符、保留關鍵字等語言元素,有它自己的語法規則。ActionScript允許用戶創建自己的對象和函數。ActionScript的語法和風格與javascript非常相似,但不完全相同。ActionScript擁有自己的句法和標點符號使用規則,這些規則規定了一些字符和關鍵字的含義,以及它們的書寫順序。例如,在英語中用句號結束一個句子,而在ActionScript中則用分號結束一個語句。

  下面列出的是ActionScript的一些基本語法規則,對于比較比較特別的規則,請參閱ActionScript詞典。

  1.點語法

  在ActionScript中,點(.)被用來指明與某個對象或電影剪輯相關的屬性和方法。它也用標識指向電影剪輯或變量的目標路徑。點語法表達式由對象或電影剪輯名開始,接著是一個點,最后是要指定的屬性、方法或變量。例如,表達式ballMC.x是指電影剪輯實例ballMC的_X屬性,_X電影剪輯屬性指出編輯區中電影剪輯的X軸位置。

  例如,submit是在電影剪輯form中設置的一個變量,而form又是嵌套在電影剪輯shoppingCart中的電影剪輯。表達式shoppingCart.form.submit=true的作用是設置實例form的submit變量的值為true。

  表達一個對象或電影剪輯的方法遵循相同的模式。例如,ballMC實例的play方法用于移動ballMC的時間軸播放頭,就像下面的語句:

ballMC.play();

  點語法使用兩個特殊的別名:_root和_parent。別名_root是指主時間軸。可以使用_root別名創建一個絕對路徑。例如,下面的語句調用主時間軸中電影剪輯functions的buildGameBoard函數:

_root.functions.buildGameBoard();

  Flash MX允許使用別名_parent來引用嵌套當前電影剪輯的電影剪輯。也可以用_parent創建一個相對目標路徑。例如,如果電影剪輯dog被嵌套在電影剪輯animal之中,那么,在實例dog上的下列語句告訴animal電影剪輯停止播放:

_parent.stop();

  2.斜杠語法

  Flash的以前版本是使用斜杠語法指出電影剪輯或變量的目標路徑的。Flash MX播放器仍然支持這種語法,但不推薦使用。在斜杠語法中,斜杠被用來代替點,用以標明電影剪輯或變量的路徑。要指出一個變量,可以在變量前加上冒號,如下面的語句所示:

myMovieClip/childMovieClip:my Variable

  我們現在用點語法取代上述斜杠語法來表示上面的目標路徑:

myMovieClip.childMovieClip.myVariable

  斜杠語法在tellTarget動作中使用最為普遍,但這種動作在Flash MX中已不再推薦使用。

  【說明】與其使用tellTarget動作還不如使用with動作與點語法兼容。

  3.大括號

  ActionScript語句用大括號({})分塊,如下面的腳本所示:

on(release){
   myDate = new Date();
   currentMonth = myDate.getMonth();
}

  4.分號

  ActionScript語句用分號(;)結束,但如果你省略語句結尾的分號,Flash仍然可以成功地編譯你的腳本。例如,下面的語句用分號結束:

colum = passedDate.getDay();
row = 0;

  同樣的語句也可以不寫分號:

colum = passdDate.getDay()
row = 0

  5.圓括號

  定義一個函數時,要把參數放在圓括號中:

 function myFunction (name, age, reader){
  …
 }

  調用一個函數時,也要把要傳遞的參數放在圓括號中:

 myFunction ("Steve",10,true);

  圓括號可以用來改變ActionScript的運算優先級,或使自己編寫的ActionScript語句更容易閱讀。

  也可以用圓括號來計算點語法點左邊的表達式。例如,在下面的語句中,圓括號使表達式new color(this)得到計算,并創建了一個新的顏色對象:

onClipEvent(enterFrame){
  (new Color(this)).setRGB(oxffffff);
}

  在上例中,如果不使用圓括號,就需要在代碼中增加一個語句來計算它:

  onClipEvent(enterFrame){
    myColor = new Color(this);
    myColor.setRGB(0xffffff);
 }

  6.大小寫字母

  在ActionScript中,只有關鍵字區分大小寫。對于其余的ActionScript,可以使用大寫或小寫字母。例如,下面的語句是等價的:

cat.hilite = true;
CAT.hilite = true;

  但是,遵守一致的大小寫約定是一個好的習慣。這樣,在閱讀ActionScript代碼時更易于區分函數和變量的名字。如果在書寫關鍵字時沒有使用正確的大小寫,你的腳本將會出現錯誤。例如下面的兩個語句:

setProperty(ball,_xscale,scale);
setproperty(ball,_xscale,scale);

  前一句是正確的,后一句中property中的p應是大寫而沒有大寫,所以是錯誤的。在動作面板中啟用彩色語法功能時,用正確的大小寫書寫的關鍵字用藍色區別顯示,因而很容易發現關鍵字的拼寫錯誤。

  7.注釋

  需要記住一個動作的作用時,可在動作面板中使用comment(注釋)語句給幀或按鈕動作添加注釋。如果你在協作環境中工作或給別人提供范例,添加注釋有助于別人對你編寫的腳本的正確理解。

  在動作面板中選擇comment動作時,字符“//”被插入到腳本中。如果在你創建腳本時加上注釋,即使是較復雜的腳本也易于理解,例如:

  on(release){
    //建立新的日期對象
    myDate = new Date();
    currentMonth=myDate.getMonth();
    //把用數字表示的月份轉換為用文字表示的月份
    monthName = calcMoth(currentMonth);
    year = myDate.getFullYear();
    currentDate = myDate.getDat();
  }

  在腳本窗口中,注釋內容用粉紅色顯示。它們的長度不限,也不影響導出文件的大小。

  8. 關鍵字

  ActionScript保留一些單詞,專用于與本語言之中。因此,不能用這些保留字作為變量、函數或標簽的名字。下表列出了ActionScript中所有的關鍵字:

break continue delete else
for function if in
new return this typeof
var void while with

  【注意】這些關鍵字都是小寫形式,不能寫成大寫形式。

  9.常量

  常量有其值永不改變的屬性。常數用大寫字母列于動作工具箱中。例如,常數BACKSPACE、ENTER、QUOTE、RETURN、SPACE和TAB是Key對象的屬性,指鍵盤上的鍵。要測試用戶是否在按Enter鍵,可使用下面的語句:

  if(keycode()= =key.ENTER){
    alert = "你準備好了嗎?"
    controlMC.gotoAndStop(5);
  }

   ActionScript中的術語

  ActionScript根據特定的語法規則使用特定的術語。以下按字母順序介紹重要的ActionScript術語.

  Actions(動作):是指導Flash電影在播放時執行某些操作的語句。例如,gotoAndStop動作就可以將播放頭轉換到指定的幀或幀標記。

  Action(動作)也可以被稱作statement(語句)。

  Arguments(參數):是允許將值傳遞給函數的占位符。例如,以下語句中的函數welcome就使用了兩個參數firstName和hobby來接收值:

function welcome(firstName,hobby) {
 welcomeText = "Heelo," + firstName + "I see you enjoy" + hobby;
}

  Classed(類):是各種數據類型。用戶可以創建“類”并定義對象的新類型。要定義對象的類,用戶需創建構造器函數。

  Constants(常量):是不會改變的元素。常量對于值的比較非常有用。

  Constructors(構造器):是用來定義“類”的屬性和方法的函數。以下代碼通過創建Circle構造器函數生成了一個新的Circle類。

function Circle(x, y, radius) {
 this.x =  x;
 this.y = y;
 this.radius = radius;
}

  Data types(數據類型):是可以執行的一組值和操作。ActionScript的數據類型包括:字符串、數值、邏輯值、對象和影片剪輯。

  Events(事件):是在電影播放過程中發生的動作。例如,當電影裁入時、當播放頭到達某一幀時、當用戶單擊按鈕或影片剪輯時、當用戶按壓鍵盤上的按鈕時,都會產生不同的操作。

  Expressions(表達式):是可以產生值的語句。例如2+2就是一個表達式。

  Functions(函數):是可以重復使用和傳遞參數的代碼段,可以返回一個值。例如,getProperty函數就可以使用影片剪輯的實例名稱和屬性名稱,返回屬性值。getVersion函數可以返回當前播放電影的Flash播放器的版本。

  Handlers(句柄):是可以管理諸如mouseDown和load事件的特殊動作。例如,onMouseEvent和onClipEvent就是ActionScript的句柄。

  Identifiers(標識符):是用來指示變量、屬性、對象、函數或方法的名稱。標識符的首字母必須是字符、下劃線(_)或美元符號($)。后續字符可以是字符、數字、下劃線或美元符號。例如,firstName就是一個變量名。

  Instances(實例):是屬于某些class(類)的對象。每個類的實例都包含該類的所有屬性和方法。例如,所有影片剪輯實例都包含MovieClip類的屬性(透明度屬性、可見性屬性)和方法(例如gotoAndPlay、getURL等)。

  Instance names(實例名稱):是一個唯一的名稱。可以在腳本作為目標被指定。

  Keywords(關鍵字):是具有特殊意義的保留用詞。例如,var就是一個關鍵字,它可以用來定義本地變量。

  Methods(方法):是指定給對象的函數。在函數被指定給對象之后,該函數就可以被稱為是該對象的方法。

  Objects(對象):是屬性的集合。每個對象都有自己的名稱和值。對象允許用戶訪問某些類型的信息。例如,ActionScript的預定義對象Date就提供了系統時鐘方面的信息。

  Operands(運算項):是由表達式中的運算符操控的值。

  Operators(運算符):可以從一個或多個值中計算獲得新值。例如,將兩個數值相加就可以獲得一個新值。

  Parameters(參數):也被稱之為Arguments(參數)。

  Properties(屬性):是定義對象的attributer(屬性)。例如,所有影片剪輯對象都具有_visible(可見性)屬性,通過該屬性可以決定影片剪輯是否顯示。

  Target paths(目標路徑):是Flash電影中影片剪輯名稱、變量和對象的垂直分層結構地址。主時間軸的名稱是_root。影片剪輯屬性檢查器中可以命名影片剪輯的實例。

  用戶可以通過目標路徑使動作指向影片剪輯,也可以使用目標路徑獲取或設置變量的值。例如,以下示例語句就是影片剪輯stereoControl內部的變量volume的路徑:

-root.stereoControl.volume

  Variables(變量):是存儲了任意數據類型值的標識符。變量可以創建、修改和更新。變量中存儲的值可以被腳本檢索使用。在以下的示例中,等號左邊的是變量標識符,右邊的則賦予變量的值:

x = 5;
name = "Lolo";
customer.address = "66 7th Street";
c = new Color(mcinstanceName);

  編寫ActionScript腳本

  編寫Flash動作腳本并不需要用戶對ActionScript有完全的了解,用戶的需求才是真正的目標。有了設計創意之后,用戶要做的就是為此選擇恰當的動作、屬性、函數或方法。學習ActionScript的最佳方法是創建腳本。用戶可以在動作面板的幫助下建立簡單腳本。一旦熟悉了在電影中添加諸如play和stop這樣的基礎動作之后,用戶就可以開始學習更多有關ActionScript的知識。要使用ActionScript的強大功能,最重要的是了解ActionScript語言的工作原理:ActionScript語言的基礎概念、元素以及用來組織信息和創建交互電影的規則等。

  1.腳本的規劃和調試

  在為整個電影編寫腳本時,腳本的數量和變化可以可能都是巨大的。例如,用戶可能需要考慮以下問題:決定使用哪些動作,如何建立更有效的腳本結構,以及在哪些地方放置腳本?所有這些問題都需要經過仔細規劃和測試。特別是當電影變得越來越復雜時,這些問題更加顯得突出。

  在開始編寫腳本之前,用戶需明確自己要達到的目標。例如,這些目標可能是使用Flash創建整個站點。

  ? 詢問站點訪問者姓名,并且在整個站點中重復使用該信息。

  ? 站點具有一個可拖動的導航工具欄,可以幫助用戶跳轉到站點的任意分支。

  ? 當某一個按鈕被單擊時,新的內容以淡入方式出現在舞臺中央。

  ? 專門設立一個和用戶聯系的場景,其中包含已經填入用戶姓名的表單。

  在明確了制作動畫要達到的目的之后,用戶就可以開始創建對象并編寫腳本來控制這些對象。

  讓腳本按照自己需要的方式工作,這通常比編寫腳本要花費時間。用戶需要經常不斷地測試自己的腳本是否工作正常。為達到目的,最好的方法是從簡單腳本開始,頻繁測試,編寫并測試完一部分可正常工作的腳本之后,就可以保存文件的一個版本。這種工作方法可以幫助用戶更有效地調試腳本錯誤,在編寫更加復雜的腳本時也有堅實的基礎。

  2.面向對象的腳本編程

  在面向對象的編程方法中,用戶通過將信息分類成組來組織信息。用戶可以創建某一類信息的多個實例,以便在腳本中使用。用戶可以使用ActionScript預定義的class(類),也可以創建自己的類。ActionScript內置的類位于動作在板的Objects(對象)文件夾。

  在創建class(類)時,用戶需為由該類所創建的每個對象定義所有屬性(特性)和方法(行為)。這和現實世界中對象的定義方法一樣。例如,“人”具有諸如性別、身高和頭發顏色之類的屬性,“人”的行為包括說話、走路、投擲等,在本示例中,“人”就是一個類,而每個單獨的人就是該類的實例,即Object(對象)。

  ActionScript中的對象可以包含數據,也可以是舞臺上的影片剪輯。所有影片剪輯都是預定義的MovieClip類的實例。每個影片剪輯實例都有MovieClip類的所有屬性(例如_height,高度;_rotation,旋轉;_totalframes,總幀數等)和所有方法(例如,gotoAndPlay,轉到并播放;loadMovie,載入電影;startDrag,開始拖動等)。

  要定義class(類),用戶需創建一個特殊的被稱為“構造器”的函數。Flash預定義的類已經定義了構造器函數。例如,如果需要電影中一個騎車人的信息,則可以創建一個名為Biker的構造器函數。該函數包括“時間”和“距離”屬性,也包含“速度”方法,該方法可以將騎車人的移動速度告訴用戶。

function Biker(t, d) {
 this.time = t;
 this.distance = d;
}
function Speed() {
 return this.time/this.distance;
}
Biker.prototype.rate = Speed;

  在編寫構造器函數之后,用戶就可以創建Biker類的副本,即:實例。以下代碼就可以創建Biker類對象的實例emma和hamish:

emma = new Biker(30, 5);
hamish = new Biker(40,5);

  實例之間還可以相互通信。例如,對于Biker類的對象來說,用戶可以創建一個shove(推)的方法,讓一個騎車人推另外一個騎車人。這樣,當hamish實例靠得太近時,emma實例就可以調用shove方法,將hamish推開。要將信息傳遞給方法,可使用參數。例如,shove(推)方法就可以攜帶who(被推者)和howFar(推多遠)參數,如下列示例。

emma.shove(hamish, 10);

  在面向對象編程方法中,類可以按指定順序相互接收屬性和方法,這就是所謂的繼承。用戶可以使用繼承擴展或重定義類的屬性和方法,從其他類繼承屬性和方法的類被稱為“子類”,將屬性和方法傳遞給其他類的類被稱為“超類”,一個類可以同時是“子類”和“超類”。

  3.腳本的流程

  Flash將從第一行語句開始執行ActionScript語句,一直按次序執行到最終語句或ActionScript指定跳轉到的語句。

  將執行次序發送到其他地方而不是下一語句的動作包括:if語句、do…while循環和return動作。

  if語句被稱為條件判斷語句或“邏輯分支”,因為它是基于某些條件的評估判斷來控制腳本流程的。例如,以下代碼就將檢查變量mynumber中的值是否否小于或等于10,如果檢查結果返回true(例如,mynumber的值為5),則變量alert被設置文本字符串值,并在輸出的文本域中顯示其值。

if (myNumber <=10) {
  alert = “The number is less than or equal to 10”;
}

  用戶也可以添加else語句來創建更加復雜的條件判斷語句。在以下示例中,如果條件判斷返回true(例如,變量mynumber的值為3),則第一組大括號之間的語句將執行,alert變量將顯示第二行的值。如果條件判斷返回false(例如,變量mynumber的值為30),則第一組代碼區將被跳過,else語句后面的大括號之間的語句將執行。

if (myNumber <=10) {
  alert = “The number is less than or equal to 10”;
}else {
  alert = “The number is greate than 10”;
}

  循環語句將重復執行某一動作若干次,直到滿足某一條件才結束。在以下示例中,影片剪輯將被復制5次。

i = 0;
do {
  duplicateMovieClip ("myMovieClip","newMovieClip"+i,i);
  newName = eval("newMovieClip"+i);
  setProperty(newName,_x,getProperty("myMovieClip",_x)+(i*5));
  i=i+1
}while(i<=5);

  4.腳本的運行

  在編寫腳本時,用戶可以使用動作面板,將腳本附加給時間軸中的幀,也可以附加給舞臺上的按鈕或影片剪輯。附加給幀的腳本將在播放頭到達該幀時執行,而附加給按鈕或影片剪輯的腳本則在某一事件發生時執行。所謂的“事件”,可以是電影播放時鼠標移動、某個按鈕被按下,也可以是某個影片剪輯被載入等。使用ActionScript可以發現操作發生的時間,然后根據該事件執行指定的腳本。

  附加給按鈕或影片剪輯的動作被一個特殊的動作包圍,該動作被稱之為handler(處理程序),onClipEvent和on動作都被稱之為處理程序,中因為它們操控或管理著操作。用戶可以為每個處理程序指定一個或多個操作。當由處理程序指定的事件發生時,影片剪輯或按鈕動作才執行。如果要在不同的事件發生時執行不同的動作,則可以給一個對象附加多個處理程序。

  onClipEvent動作處理的是影片剪輯的事件,而on動作則處理按鈕的事件。用戶也可以和影片剪輯一起使用on動作,創建一個能接受鼠標事件的影片剪輯。