Action 初學

第 1 部分: ActionScript 基礎


第 1 章: 代碼格式及規範
代碼格式
ActionScript 的每行語句都以分號 ";" 結束. 不同於 BASIC 語言, ActionScript 語句同 C++, Java, Pascal 一樣允許分多行書寫, 即允許將一條很的長語句分割成兩個或更多代碼行, 只要在結尾有個分號就行了. 允許語句分行書寫的唯一缺點是(至少對許多熟悉 BASIC 的人而言): 語句末尾不能忘記加分號. 語句分行唯一的限制是字符串不能跨行, 即兩個分號必須在同一行.

分行書寫長語句也是一個很好的排版辦法, 例如下面的語句段(目前你不需理解下面的語句是什麼意思, 在雙斜槓後面是註釋):

duplicateMovieClip( "MyOldMovieClip",    //舊的 MovieClip 實例名
                    "MyNewMovieClip", 999 );   //新複製的實例名和所在層次
setProperty( "MyNewMovieClipNameIsNewMC",   //要修改其屬性的 MovieClip 實例名
             _alpha, "30");   //修改其透明度爲 30%
但是在 Flash MX 中似乎自動格式化功能不是很完善. 上面的代碼可以運行通過, 但在使用自動格式化時會出錯. 問題就在於插入其間的註釋語句. 畢竟上面我寫的例子並不是很好地符合 Flash MX 的語法規範(但按照 C 語言的語法來看是絕對沒問題的), 所以請記住: 只有在語句很長或是很複雜的情況下才使用多行書寫.
--------------------------------------------------------------------------------

一個好的程序員會懂得在程序代碼中加入註釋. 但也許你會說: 沒關係, 我知道我寫的是什麼. 但是假如你是在 1 個月後再讀這段代碼呢? 很明顯, 你記不住. 所以多打幾個字又有什麼麻煩的?

給 ActionScript 代碼加註釋使用下面格式:

statements; //這是單行註釋, 由雙斜槓開頭,這行的後面部份都是註釋內容
statements; /* 這也是註釋
               只不過可以換行 */
就這麼簡單(卻又十分有用). 注意 /* 和 */ 已經不建議使用了(因爲必須配對, 所以經常會導致錯誤).


--------------------------------------------------------------------------------
除了註釋, 增加代碼可讀性的另一途徑是使用代碼排版格式. 下面是一段具有高可讀性的代碼:

//計算 x 階乘的函數
function f(x) {
   if (x<=0) {  //假如 x 小於等於 0
     return 1;  //返回 1
   } else {
      return x*f(x-1);  //否則返回階乘結果
   }
}

Flash MX 之前版本必須由程序員自行編排代碼格式, 而 Flash MX 的 Action 面板多了一個 Auto Format (自動格式化)按鈕 , 可以用它來自動格式化代碼(同時也會進行語法檢查, 相當方便). 格式化的選項可以在 Action 面板彈出菜單的 Auto Format Options 項對應的對話框中設置.
語法着色和代碼提示
語法着色(Syntax Hightlighting)是許多編程語言的 IDE (集成開發環境)所具備的功能. Flash 也具有這項功能. 語法着色的顏色可以在 Action 面板彈出菜單的 Preferences... 項對應的對話框中設置.

對此, 沒什麼好詳細解說的. 只是希望大家能利用語法着色來發現錯誤和閱讀代碼.

Flash MX 新增加的代碼提示功能(Code Hints)對於熟悉 Visual Studio 6.0+ 版本的讀者而言並不陌生. 例如在輸入了一個對象名後再輸入".", 就會顯示相關的屬性和方法列表; 在輸入了函數名後輸入"(", 就會顯示相關的函數格式. 具體的可在輸入代碼時自己體會.

語法規範
關鍵字
關鍵字是任何一種語言程序的基本構造單位. 它是程序語言的保留字(Reserved Words), 不能被作爲其它用途(不能作爲自定義的變量, 函數, 對象名).

Flash 的 ActionScript 中關鍵字不是很多, 下面的它們的列表:

Flash MX ActionScript 的關鍵字
break 跳出循環體 instanceof 返回對象所屬的類(Class)
case 定義一個 switch 語句的條件選擇語句塊 new 使用構造函數(Constructor)創建一個新的對象
continue 跳到循環體的下一項目 return 在函數中返回值
default 定義 switch 語句的默認語句塊 switch 定義一個多條件選擇語句塊
delete 清除指定對象佔用的內存資源 this 引用當前代碼所在的對象
else 定義 if 語句返回爲假時的語句塊 typeof 返回對象的類型
for 定義一個循環 var 聲明一個本地變量(Local Variable)
function 定義一個函數語句塊 void 聲明返回值類型不確定
if 定義一個條件語句塊 while 定義一個條件循環語句塊
in 在一個對象或元素數組中創建循環 with 定義一個對指定對象進行操作的語句塊  

列出這些並不是要求你像背單詞一樣把它們背下來(這也是爲什麼中國的教育質量這麼差的原因), 只是希望大家記住: 在 Flash 中有一些作爲關鍵字的單詞是不能隨意使用的. 這在分析錯誤的時候是很有用的(特別對於初學者).

大小寫敏感
同 C++ 和 Java 一樣, ActionScript 是區分大小寫的.

這就意味着: If 並不等於 if. 假如在代碼中使用了 If, 在運行和檢查時都會產生錯誤. 避免這種情況發生其實很簡單: 多注意一下輸入的代碼是否自動地被語法着色了(Syntax Hightlighting).

但是對於變量(Variable), 實例名(Instance Name)和幀標籤(Frame Label), ActionScript 是不區分大小寫的. 儘管如此, 我還是建議大家在書寫代碼時保持大小寫一致. 這是個很好的習慣.


運算符
除了關鍵字, 程序語言中最重要的組成部分就是運算符. 先不要說我死板, 因爲不瞭解這些東西, 你什麼也做不成.

下面是運算符的列表, 運算符的優先級(即幾個運算符出現在同一表達式中時先運算哪一個)從上到下遞減:

運算符
描述

+ 一元(Unary)加
- 一元(Unary)減
~ 按位(Bitwise)邏輯非
! 邏輯非(NOT)
not 邏輯非 (Flash 4 格式)
++ 後期(Post)遞加
-- 後期(Post)遞減
( ) 函數調用
[ ] 數組(Array)元素
. 結構(Structure)成員
++ 先期(Pre)遞加
-- 先期(Pre)遞減
new 創建對象
delete 刪除對象
typeof 獲得對象類型
void 返回未定義值
* 乘

/ 除
% 求模(除法的餘數)
+ 加
add 字符串(String)連接 (過去的&)
- 減
<< 按位左移
>> 按位右移
>>> 按位右移 (無符號 unsigned, 以 0 填充)
< 小於
<= 小於或等於
> 大於
>= 大於或等於
lt 小於 (字符串使用)
le 小於或等於 (字符串使用)
gt 大於 (字符串使用)
ge 大於或等於 (字符串使用)
== 等於
!= 不等於
eq 等於(字符串使用)
ne 不等於 (字符串使用)
& 按位(Bitwise)邏輯和(AND)
^ 按位邏輯異或(XOR)
| 按位邏輯或(OR)
&& 邏輯和(AND)
and 邏輯和 AND (Flash 4)
|| 邏輯或 OR
or 邏輯或 OR (Flash 4)
?: 條件
= 賦值
*= /= %=
+= -= &=
|= ^= <<=
>>= >>>=  
複合賦值運算
,  多重運算  


寫了這麼一大版(也可以說是抄了), 有什麼用? 你會發現這些運算符與 C++ 和 Java 的運算符沒什麼很大的區別, 無論是形式上還是功能上. 作爲初學者你必須記住其中比較常用的部分(不常用部分的說明文字背景較暗). 這對你今後寫表達式有很大幫助.

對於運算符的使用, 也有一些要注意的地方.
例如 and 和 or, 雖然對於效率而言與 && 和 || 沒什麼至關重要的區別, 但如果你過去使用過 BASIC, 你肯定會選擇前者的表示方式; 假如你過去是使用 C++ 或是 Java 的, 那麼你就會傾向於使用後一種方法. 就我個人的觀點, 爲了使代碼具有高可讀性, 初學者還是應該使用意思明瞭的 and 和 or.

特別是像 ?: 這類極其簡化的運算符, 初學者更難以閱讀. 例如下面代碼:

x = 5;
y = 10;
z = (x < 6) ? x: y;  //如果 x 小於 6, 就把 x 的值賦給 z, 否則將 y 的值賦給 z
trace (z); //返回 5
從上例開始, 本教程中的所有範例代碼都可以複製粘貼到新建的 Flash 動畫的第一幀的 Action 裏. 然後通過 Control 菜單的 Test Movie 項或是按下組合鍵 CTRL+ENTER 運行它. 這樣你就可以看看這些代碼有什麼實際效果了. 當然你也可以試着改動這些代碼, 通過改動的效果來理解教學的內容.

就不如下面的代碼易於理解(儘管很冗繁):

x = 5;
y = 10;
if(x < 6){  //如果 x 小於 6, 就把 x 的值賦給 z, 否則將 y 的值賦給 z
   z = x;
} else {
   z = y;
}
trace (z); //返回 5
常量
常量是在程序運行中不會改變的量.

例如數值 1,2,3..., 邏輯值 true, false 等等. 另外還有一些系統內建的常量, 具體的可以看幫助文件的內容.

表達式
在 ActionScript 中最常見的語句就是表達式, 它通常由變量名, 運算符及常量組成. 下面是一個簡單的表達式:

x = 0;
左邊是變量名(x), 中間是運算符(賦值運算符 "="), 右邊是常量(數值 0). 這就是一個非常簡單的賦值表達式. 由這個表達式我們可以聲明(Declare)一個變量, 爲下一步操作做準備.

表達式又分爲賦值表達式, 算術表達式和邏輯表達式.

賦值表達式上面已經說明了, 就是給變量一個值. 算術表達式顧名思義就是做數學運算的表達式, 例如: 1+3 (返回值爲數值 4). 邏輯表達式就是做邏輯運算的表達式, 例如: 1>3. 只不過邏輯表達式返回的是邏輯值而已. 前面的 1>3 返回值爲 false, 即 1 大於 3 爲假.

將多個表達式組合在一起就可以組成複合表達式, 一般我們用到的也是這種表達式. 例如:

t = 3*3+(2+3);
x = 1>3;
上面的第二行是一個邏輯-賦值複合表達式. 首先 Flash 計算邏輯表達式 1>3 的值(false), 然後將該值賦給 x (即 x = false;). 對於複合表達式的運算順序可以參考上面的運算符表. 要改變運算順序可以使用圓括號(例子的第一行), 這是同其它語言一致的.

這一章就到此爲止. 在下一章中, 我們將詳細討論 Flash 中的數據類型及變量的使用.


第 2 章: 變量及數據類型
變量
定義變量
變量是什麼? 大概說來就是存放信息的容器(更確切的說是指向內存空間中某個存貯位置的指針, 不過能夠理解就行了, 何必去記這麼抽象的定義). 只要能夠理解它可以存放信息並可以通過各種途徑改變其中的信息就可以了, 我又不是大學裏面的老師, 整天就知道叫學生死記硬背定義, 實際的東西一點都沒有, "一切爲了考試".
還有一個概念: 什麼叫初始化變量? 就是在定義時給它一個有效值以說明它的內容和數據類型. 就像下面的例子, 定義了一個字符串(String)變量:

MyString = "我不懂什麼是初始化變量";
就這麼簡單, 但是也有要注意的問題:

變量名必須爲有效的標識符(例如不能以數字和不允許使用的字符開頭).
變量名不能與 ActionScript 關鍵字和常量相似或相同.
變量名在它的作用域(Scope)中必須是唯一的(在下面我們會提到什麼是作用域).
變量作用域
也就是變量在什麼範圍內是可以訪問的. 就好像在 C&C: Renegade 中的任務一樣, 沒有 Security Level 3 的 ID Card 就進不了安全級別爲 3 的區域的.

作用域一般說來有三種: 時間線(Timeline), 局部(Local), 全局(Global).

於時間線範圍的變量, 就像上面的例子一樣用 = 賦值並聲明, 當然你也可以用 set 動作(Flash 4, 不推薦使用的方法, 除非你覺得代碼不夠長):

set( MyString, "我不懂什麼是初始化變量" );
時間線範圍變量聲明後, 在聲明它的整個層級(Level)的時間線內它是可訪問的.

局部變量就是在聲明它的語句塊內(例如一個函數體)是可訪問的變量, 通常是爲避免衝突和節省內存佔用而使用.

聲明它可以使用 var 關鍵字:

function LocalVar(){
   var MyLocalString = "這是一個局部字符串變量";
   trace( "Inside: " + MyLocalString );
}

LocalVar();
trace( "Outside: " + MyLocalString );
上面的 MyLocalString 字符串變量在函數尾就會被自動清除出內存. 所以在外面的 trace 語句返回結果爲空("Outside:"), 而函數體內的 trace 返回:"Inside: 這是一個局部字符串變量".

假如你刪除了 var 關鍵字, 那麼 MyLocalString 就成時間線範圍的變量了. 運行後顯示 Inside 和 Outside 都爲 "這是一個局部字符串變量". 在後面的函數一章我們還會提到局部變量的內容.

也許你注意到了函數中有一個 trace 動作. 它可以在測試模式(Testing Movie, CTRL+ENTER 組合鍵)下把指定變量的值發送到輸出窗口(Output Window), 以便在運行時檢查處理變量的代碼是否正常. 這是一個非常方便的檢查方法, 在測試代碼時經常使用.

在代碼中如果遇到有不清楚的函數和關鍵字, 可以通過 Action 面板的參考按鈕(Reference)打開參考面板顯示光標所在位置關鍵字或內建函數以及對象的詳細信息, 也可以通過組合鍵 SHIFT+F1 打開它
--------------------------------------------------------------------------------

全局變量, 顧名思義就是在整個 Movie 中都可以訪問的變量. 它的聲明比較特殊:

_global.MyGlobalString = "這是一個全局字符串變量";
聲明使用了一個 _global 標識符和點語法(Dot Syntax, 將在後面的章節討論). _global 標識符是在 Flash 6 中新增加的, 用於創建全局變量, 函數, 對象和類(Class, 不清楚類是什麼的話可以看看 C++ 的書).

總的來說 _global 是一個與最底層 _level0 並列的對象. 所有的全局變量, 函數, 對象其實就相當於是它的屬性, 方法, 子對象. 關於它的具體內容可以查閱幫助文件, 一般我們只要懂得用就行了.

全局變量不會被同名的時間線變量和局部變量屏蔽(Obscured), 也就是說, 它在 Movie 內的任何地方都是可訪問的, 並且優先於時間線變量和局部變量訪問.

在代碼中使用變量
使用變量很簡單, 有點編程基礎的讀者都可以辦到. 下面用一個例子來說明在 ActionScript 中變量的使用:

function vars(x){
   if(x<5){       //如果 x 小於 1
      x = x + 1;  //x 加 1
   } else {
      x = 10;  //否則賦值 10
   }
   trace("x="+x);
   return x;
}

vars(2);
vars(6);
trace("x="+x);  //測試 x 是否爲局部變量
函數聲明中的參數無需加 var 聲明也自動作爲局部變量(例如上面例子中的 x). 通過上面例子的最後一句就可以看出來(返回值爲空).

我們可以看到, 上面定義的函數中對局部變量 x (在函數參數中聲明)進行了 4 種操作:

賦值: 就是改變變量所存貯的內容.
運算: 使用運算符運算並返回結果. 上例中的 x = x + 1 可視爲一個運算操作(x + 1)和一個賦值操作(x = ...)的複合語句. 對於邏輯運算(上面 if 語句的條件), 返回的爲邏輯值 true 或 false(就像 x<5 在 x 爲 4 時會返回 true).
函數及命令調用: 就如上面 trace("x="+x); 中的一樣, x 是被作爲參數傳遞給函數的, 它代表的是它所存貯的實際內容(在 return x; 中也一樣).
在 ActionScript 中變量的使用具有很大的靈活性, 下面我們將會針對不同的數據類型進行講解.

常見數據類型
字符串 | String
一個字符串就是一系列的字符, 例如 "This" 就是一個字符串.

定義一個字符串變量很簡單, 只要在初始化時將一個字符串數據賦給它就行了:

chapter = "第 2 章";
section = "第 2 節";
section_name = "常見數據類型";
full_name = section + " " add section_name + 999;  //連接字符串
if(typeof(full_name) ne "string"){
   full_name = "類型錯誤!";
}
trace("full_name=" + full_name);

上面的第 4 行的 full_name 的值是前面兩個變量(section 和 section_name)和一個常量(999)的運算結果(使用了 + 和 add 運算符, 它們的功能是相同的). 請注意, 這行代碼最後面的數值常量 999 不是同一類型的數據, 如果在 Pascal 這種數據類型檢查極其嚴格的語言中這行代碼是錯誤的. 但是 ActionScript 可以自動將它轉換爲字符串格式, 而不需要專門的函數(當然, 最安全的方法是使用 Number 對象的 toString() 函數或是 String() 函數). 由此可見, ActionScript 是一種弱類型檢查的語言(即不嚴格限制各種數據類型間的運算和傳遞), 這和 VB 倒是有點相似, 只不過更過分一點.

在後面我用了一個 if 語句來測試後面加上 999 的代碼是否運行正常(即檢查表達式返回的值是否爲字符串, 儘管在實際中並沒有這個必要). 注意我用的是字符串類型專用的邏輯運算符 ne, 當然這只是爲了表現字符串數據類型的特殊性, 實際應用中用 != 也就可以了. 對於 typeof 操作符, 我們會在這一章的末尾詳細講解.


發佈了23 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章