Download presentation
Presentation is loading. Please wait.
1
第 20 章 ActionScript 指令與語法
2
本章提要 20-1 變數與變數範圍 20-2 資料類型 20-3 運算子 20-4 判斷條件與迴圈 20-5 Flash 的路徑階層觀念
3
20-1 變數與變數範圍 變數是用來讓程式暫存資料的, 變數中所存的資料就叫做變數的「值」, 變數的值可以是字串、數字、布林值...等資料 (關於資料型態請參考 20-2 節)。在使用變數時, 必須要注意變數的有效範圍, 否則可能造成程式運作結果錯誤。 由於在 Flash 中, 變數常應用在顯示文字方面, 所以 Flash 有一種特別的變數型態, 叫做文字欄位變數, 這種變數可從屬性面板設定, 使用起來十分簡單方便。
4
宣告變數與指定變數值 在 ActionScript 中不需要事先宣告也可以直接使用變數。事先宣告變數的意思是指, 以 var 指令告訴 Flash, 程式待會兒需要使用這個名稱的變數, 請電腦在一開始執行程式時就為該變數保留一些記憶體空間。 若是沒有事先宣告, 則 Flash 會在該變數第一次出現時, 才依需要分配記憶體空間給它。
5
宣告變數與指定變數值 不過有經驗的程式設計師都會建議你在使用變數前先行宣告, 這樣一方面可以確認變數的有效範圍 (請參考稍後的說明), 避免程式錯誤;另一方面, 養成這樣的好習慣, 對於日後學習其它規定更嚴格的程式語言時會很有幫助 (許多程式語言如 Java 、C...等在使用變數時必須事先宣告)。 以下介紹 ActionScript 中宣告變數與指定變數值的指令。
6
var var 指令可用來宣告變數, 位於陳述式/變數類別下, 請在變數欄輸入欲宣告的變數名稱:
7
var
8
var 我們再說明以下的範例:
9
變數的命名規則 ActionScript 的變數命名, 有一些重要規則需要遵守:
雖然 Flash 可以接受任何 Unicode 文字 (包含中文), 但為了確保與其它版本的 Flash 相容, 也要確保能與其它網頁程式 (JavaScript、ASP、PHP...等) 相容, 變數名稱最好以英文命名。 變數名稱不能使用除了 「_」 (底線) 之外的特殊符號, 中間也不能有空格。
10
變數的命名規則 變數名稱不能使用 ActionScript 的關鍵字 (如:play、stop、goto...等), 也不能使用布林值 (true、false)。為了避開這個問題, 一般變數命名習慣使用「my」 做開頭, 後面接著第一個字母大寫的單字, 例如「myComputer」。如此一來, 即使變數命名成「myPlay」, 也不會造成程式錯誤。
11
變數的命名規則 變數沒有大小寫之分, 所以「car」、「CAR」、「Car」都會被當成同一個變數。不過為了方便辨識, 建議你統一大小寫的寫法。最好使用有意義的變數名稱, 像撰寫程式時, 存放得分的變數就可以命名為「myScore」, 而不要命名成「a1」、「a2」、「x 」 ...之類無意義的名稱, 以免日後連自己都記不清楚該變數的用途。
12
set variable set variable 指令是用來指定值給變數, 位於陳述式/變數類別下。它有變數與值兩個參數需要設定, 在變數欄位中輸入變數名稱;在值欄位中輸入要指定給該變數的值。
13
set variable
14
set variable
15
變數的有效範圍 ActionScript 中的變數可分為時間軸變數、區域變數與全域變數 3 種。大部份的時候, 我們宣告的變數都是時間軸變數;只有在函數、自訂函數 (function 指令) 中宣告的變數才屬於區域變數;至於全域變數需要在宣告變數後, 指定變數值時再特別指定:
16
變數的有效範圍 區域變數:區域變數只有在函數執行的時候才存在, 函數執行完畢後就消失。
時間軸變數:時間軸變數一旦經宣告後, 在哪裡都可以讀取到它, 不過必須注意它被宣告時所在的路徑階層 (請參考20-5 節), 才能正確讀取到它。 全域變數:全域變數和時間軸變數類似, 一旦宣告後, 不論在哪裡都可以讀取到它。差別在於全域變數不需要指定路徑也能夠讀取。
17
變數的有效範圍 以下是一個區域變數與時間軸變數的簡單範例:
18
變數的有效範圍 trace 輸出結果會變成 myVar1 的值為 10 , 而 myVar2 的值為 undefined (未定義)。
從這個結果我們可以明顯地看出, 在函數內宣告的 myVar2 是一個區域變數, 在 testVar 函數執行完畢後就消失了。
19
文字欄位變數的應用 文字欄位變數是 Flash 特有的變數型態, 它直接與文字欄位 (動態文字與輸入文字) 相關聯。你可以替文字欄位設定一個專有的變數, 則變數的值就會直接顯示在該文字欄位中。以下是文字欄位變數的簡單應用: 首先使用文字工具拉曳出一個文字物件。
20
文字欄位變數的應用 開啟屬性面板, 將文字類型設為動態文字 (或輸入文字)。然後在變數欄中輸入變數名稱, 即完成變數宣告的工作。
21
文字欄位變數的應用 接著在文字欄位所在圖層上方, 建立獨立的 Actions 圖層, 然後在文字欄位所在影格的上方影格設定如下的 ActionScript , 就可以按下 [Ctrl] + [Enter] 鍵測試影片:
22
文字欄位變數的應用
23
文字欄位變數的應用 相反地, 如果使用文字工具直接在該文字欄位鍵入文字, 該文字就會變成變數值, 若將文字欄位設定成輸入文字類型, 便可以讓使用者輸入資料, 做為變數值來應用。
24
20-2 資料類型 資料類型是指儲存在變數或 ActionScript 元件中的資料形式 (例如影片片段元件的寬度) , 可分為:字串、數值、布林值、Null、undefined、影片片段及物件, 以下分別進行說明。
25
字串 字串是用雙引號「" "」或單引號「' '」括起來的文字與數字, 如以下程式指定變數值時, 在文字的前後加上雙引號, 就表示指定該值的資料類型為字串:
26
如何得知資料類型 你可以用 typeof 指令 (屬於運算子/各種運算子類別) 來檢驗資料的類型, 例如我們想要得知 myData 變數中的資料類型。 輸出結果為 String, 即是指字串類型。
27
數值 數值包括正負整數與正負實數 (包含小數點的數字)。數值資料類型不能有英文字母、雙引號或是其它任何除了小數點「.」與負號「-」之外的特殊符號。如以下程式都是指定數值類型的資料做為變數值:
28
數值 以下是錯誤的寫法:
29
布林值 布林值類型的資料只有兩種, 一為 true (真), 一為 false (偽)。在比較運算式中, 布林值常被用來顯示結果:
30
Null Null 資料類型只有一個值, 就是 null, 這個值代表沒有資料, 它有一些比較特殊的應用, 例如將它當做函數的參數, 讓函數執行時忽略該參數...等。
31
undefined undefined 資料類型只有一個值, 就是undefined。當變數尚未被賦予任何值時, 其預設值就是 undefined (未定義)。以下程式就是宣告變數後尚未指定其值, 就要求輸出其值, 因此得到的值就會是 undefined。
32
影片片段 影片片段資料類型是 ActionScript 中唯一具有實體圖像的資料型態, 它記錄了影片片段實體的變數、屬性 (Properties) 與方法 (Method)。在以下的程式裡, 我們把一個實體名稱為 fish 的影片片段實體 X 座標位置資料, 存入名為 myVar 的變數中:
33
物件 此處物件是指 ActionScript 中虛擬的物件, 與我們在舞台中繪製的形狀填色、線條之類的物件不同。在 Flash 的 ActionScript 中, 使用者可以創造程式中虛擬的物件, 藉以統一控制各種屬性。物件的每個屬性都有名稱和值, 而屬性的值可以是任何資料類型。
34
關於資料類型的轉換 由於 ActionScript 對於資料類型的規定並不是那麼嚴格, 因此有時候依據程式執行需要, Flash 會自動幫你做一些資料類型的轉換, 這個動作會讓某些原來看似不合理的程式能夠正常執行, 例如:
35
20-3 運算子 所謂的運算子, 就是加、減、乘、除之類的符號, 但在 ActionScript 中還有許多功能特殊的運算子, 其中有的運算子意義與數學裡的運算符號並不一致, 舉個最普通的例子, 就是「=」運算子, 在 ActionScript 中它屬於「指定運算子」 , 功用是在指定值給變數, 而不像在數學裡「=」是「等於」的意思。
36
運算子 Flash 中的運算子都列在運算子類別下, 依功能分類分別是比較運算子、位元運算子、數學運算子、邏輯運算子、指定及其他運算子。以下我們僅選擇最基本的數學、比較、邏輯 3 類加以列表說明。
37
數學運算子
38
比較運算子
39
邏輯運算子
40
20-4 判斷條件與迴圈 判斷條件與迴圈是讓程式根據各種條件, 判斷是否執行某些程式, 或是決定程式執行順序的語法。你可以在陳述式/ 判斷條件/ 迴圈類別中找到這類指令, 以下我們僅針對最常使用的 if 條件式加以詳述, 並列表補充說明其餘同類語法。
41
if 條件式 if 指令的運作方式是:當判斷條件傳回值為 true 時, 執行接下來大括弧中的程式, 若傳回 false , 就不執行該程式。 因此 if 指令只有一個參數需要設定, 就是判斷條件, 你必須在該欄位中輸入用來判斷的運算式、變數, 而且必須注意判斷條件欄位中的運算式或變數, 必須傳回布林值 (也就是 true 或 false), 這樣 if 指令才能正常進行判斷。
42
if 條件式
43
if 條件式 再以一個簡單的範例來說明:
44
其他常用判斷條件或迴圈指令
45
Flash 獨有的影格迴圈 前述的迴圈指令都是純程式製作的迴圈, 但是 Flash 本身含有時間軸, 故其順序播放的特性提供了另一種迴圈方式, 也就是利用 goto 指令來製造影格迴圈。 例如我們在第 5 格影格設定了影格動作, 又在動畫最後 1 格以 goto 指令讓動畫跳到第 3 格影格播放, 這樣動畫會一直在第 3 階到最後 1 格影格間重複播放而形成迴圈。
46
Flash 獨有的影格迴圈 迴圈中的程式, 即影格 5 的影格動作, 就會一再地被執行。不過影格迴圈會有明顯的時間差, 不像一般迴圈指令執行的頻率那麼高。
47
20-5 Flash 的路徑階層觀念 由於使用 ActionScript 操控各類實體 (影片片段、按鈕、文字) 時, 必須正確指定目標 (包含實體的路徑和名稱), 而路徑一旦錯誤, 實體就接收不到 ActionScript 的訊息, 也無法依據程式執行動作。由於 Flash 動畫的元素眾多、結構龐大, 再加上 Flash 還可以動態載入外部檔案, 所以弄清楚舞台上實體的路徑階層, 就變成使用 ActionScript 重要的基本知識之一了。
48
Flash 的路徑階層觀念 我們在第 19 章的練習中並不需要指定任何目標實體, Flash 就知道 stop 或 goto 指令是要控制整個主動畫。 這是因為全域函數/時間軸控制項類別下的指令, 主要就是針對整個時間軸主動畫設計的, 所以這些指令中不需要指定目標參數。
49
Flash 的路徑階層觀念 此外當你沒有指定程式的作用目標時, ActioinScript 就會把該程式所在位置的實體 (19-4 節程式所在的位置是主動畫的時間軸上) 當成作用目標。 有鑒於 Flash 路徑階層觀念的重要性, 以下我們詳加說明 Flash 動畫中各階層的關係, 以奠定你日後活用 ActionScript 的基礎。
50
階層 每個新開啟的 Flash 文件都有一個時間軸主動畫, 這個主動畫可以隨著影格、場景的增加一直延伸。原始的時間軸主動畫, 在 Flash 階層 (level) 中名為「_root」, 也就是根目錄動畫。在 19-4 節範例檔 fla 中, 若以指定目標的方式撰寫, 可寫成如下的程式:
51
階層
52
階層 這個原始的時間軸主動畫 _root, 也稱為_level0。既然有 _level0 (第 0 階層), 那麼就有 _level1、_level2。例如當你利用 loadMovie 指令 (在全域函數/瀏覽器/網路類別下) 動態載入外部 Flash 影片檔 (.swf) 到目前所在動畫中, 就可以指定要將這個 .swf 檔載入哪一階層。
53
階層
54
階層 Flash 動畫的每個階層都有獨立的時間軸, 而且每個階層只能有一個時間軸主動畫, 若你將 .swf 檔載入已有時間軸主動畫的階層中 (例如 _level0), 則後載入者將把原始存在的動畫取代掉。
55
階層 由於每個階層都有獨立的時間軸, 所以每個階層的時間軸主動畫都稱為 _root。舉例來說, 如果你在 _level1 主動畫設定 「_root.stop();」, 因為沒有指定是哪一個階層, 所以停止播放的將是 _level1 的時間軸主動畫;若設定的程式為特別指定 level0 的 「_level0.stop();」 , 那麼停止播放的將會是 _level0 的時間軸主動畫。
56
實體目標路徑與深度 在第 6 章我們介紹過, 舞台中的實體 (影片片段、按鈕、文字) 可以命名好讓 ActionScript 控制, 而舞台中的實體除了名稱之外, 還有一個深度 (depth) 屬性。 實體的深度就是該實體所在位置的高低 (亦即 Z 軸位置, 可以有負值), 不同的實體原則上不可以存在於同一個深度。
57
實體目標路徑與深度 例如以 duplicateMovieClip 或attachMovie 等指令即時複製或載入影片片段實體時, 必須指定載入的深度, 若將不同實體載入同一深度, 則後載入的實體將會把前者取代掉。 不過若是利用 swapDepths 指令切換既有實體到同一深度, 則 Flash 將用所在圖層與浮動層順序來決定誰在上方。
58
實體目標路徑與深度 雖然階層和深度都同樣是表示層級, 但實體的深度都只會在1 個階層中呈現, 所以深度的層級只是在階層中再細分的層級。我們以下圖來解說階層到實體深度的整體關係:
59
實體目標路徑與深度
60
指定目標時的絕對路徑與 相對路徑 在 ActionScript 中指定作用目標時, 還有絕對路徑和相對路徑兩種形式, 而ActionScript 所在位置對路徑標記也有影響。我們以 ActionScript 2.0 類別/影片/MovieClip/方法下的 gotoAndStop 指令為例來解說:
61
指定目標時的絕對路徑與 相對路徑
62
指定目標時的絕對路徑與 相對路徑
63
指定目標時的絕對路徑與 相對路徑
64
指定目標時的絕對路徑與 相對路徑 一般來說, 使用絕對路徑標記比較容易, 也比較不容易出錯, 但是當動畫中使用loadMovie 指令, 以指定目標路徑的方式載入含有 ActionScript 的.swf 檔時, 該檔內又使用絕對路徑標記時, 就會造成路徑錯誤, 使程式無法正常執行。所以到底哪種標記模式較好並沒有定論, 你必須依照自己的需要選用。 我們再來說明絕對路徑與相對路徑的範例:
65
指定目標時的絕對路徑與 相對路徑
66
指定目標時的絕對路徑與 相對路徑
Similar presentations