程式設計很簡單 (Programming is So Easy)                 by 蔡神 tsaiwn@csie.nctu.edu.tw
    程式設計(Programming)跟規劃活動一樣簡單, 尤其是 Flash 的程式設計更是簡單 !
其實, 應該說程式設計其實就是規劃活動, 程式(Program)的另一個翻譯就是"計畫"或"規劃",
目的是要電腦照我們的"規劃"逐步做事情。
    撰寫程式就好像你要教一個很聽話但沒主見的小孩子做事, 電腦就是那個沒主見的小孩,
你說甚麼他就做甚麼, 完全照你的"規劃"(program; 計畫, 又翻譯為程式)一步一步做!
只是因為電腦很快, 一秒大概可以做一千萬個命令, 於是就可以做出看起來很厲害的事情了。

    先來說說基本概念, 用非正式的方式介紹程式設計, 不要管電腦語言文法的問題。
為了方便已經有點概念的同學複習或跳著看, 以下分為數個主題, 點看之後若沒開新窗,
隨時可以點按視窗左上角的回到這)。
    如果你是初學者或是沒有程式設計概念者, 建議把這篇從頭到尾仔細的看過! 
(沒有很多, 大約十五分鐘可以看完, 萬一不太懂就多看兩三次:-)

  先看看 Flash 程式最常寫的三句話 (看完按左上角回到這)

  其實你小時候跟你老媽老爸寫過程式 ! (看完按左上角回到這)
  事件(Event)是蝦密碗糕 ? (看完按左上角回到這)
  變數(Variable)是蝦密碗糕 ? (看完按左上角回到這)

  運算式(Expression)與條件式(Conditional expression) (看完按左上角回到這)
  控制敘述(Control Statement)與條件式的關係 (看完按左上角回到這)
  可做很多次的迴圈(Loop statement) (看完按左上角回到這)

  更多關於事件(Event)簡介: 看看十七種滑鼠事件中的八種 ! (看完按左上角回到這)

  來寫個會讓影格停大約兩秒的Flash程式碼... (看完按左上角回到這)
  函數(function)是甚麼碗糕? (看完按左上角回到這)
  例外或異常的防範處理(Exception Handling) (看完按左上角回到這)

* Flash拖拉物件放掉後如何知道放在啥東西上?
* Flash碰撞偵測 hitTestObject(物件) 與 hitTestPointer(X座標, Y座標)

  寫程式到底可以用哪些敘述(statement)? (看完按左上角回到這)

  要善用程式碼片段Code Snippets (看完按左上角回到這)
      ** 可以把這個我寫的程式碼片段 godSnippets.xml 抓回你電腦(按滑鼠右鍵另存新檔), 從Flash動作面板匯入它。
  要善用程式碼提示 Code Hint (看完按左上角回到這)
 

點這看Flash ActionScript 3.0 程式設計手冊(開新窗) 點這看 Java SE APIs onLine (6.0)(開新窗) 點這看關於 Unity遊戲引擎所用腳本語言API可點這連過去看(開新窗) 何以說 Flash 的程式設計更是簡單呢? 因為絕大部分時候我們都是學立委包工程轉包出去的概念, 真正自己做的事其實不多 :-) Flash 的AS3(ActionScript 3.0)程式絕大部分要寫的是以下三句: stop( ); // 停在這影格; 兩個斜線 // 之後的是註解, 電腦不看 ! function 處理函數(e: Event) { gotoAndPlay("大帥哥"); } ggyy.addEventListener("某事件", 處理函數); * 第一句 stop( ); 是告訴播放器要停在目前這個影格, (因為AS3的程式碼通常是寫在某個關鍵影格(Frame)上面) 停止播放並不表示不做事, 應該說停止播放是為了要做我們要它做的事情! 請注意這裡的 stop( ); 不會讓我們寫的程式停止喔, 只是播放器的讀寫頭停在這影格, 這與有些電腦語言用 stop( ); 表示停止目前程式不一樣。 **第二句是一個函數(function; 函式), 函數是事先準備好的一組程式碼, 是給別人叫用的, 若沒人叫用則不會被執行; 這裡的例子是為了處理某事情寫的函數, 所以正式的說法應該是 "處理函數", 這邊故意把名稱寫 "處理函數", 其實最好是取英文名稱(雖然目前版本寫中文也沒問題, 但用到某些中文字仍會出問題), 而且取名稱最好遵守一般變數與函數命名慣例。 函數寫的順序也不重要, 很多人習慣寫在上面第三句的下方; 這例子是要搭配第三句, 往下看第三句說明就會瞭解 ! 函數通常會寫許多句子, 急著知道函數概念的, 後面有更多關於函數(function; 函式)的說明。 本例子函數身體只有一句 gotoAndPlay("大帥哥"); 意思是去播放影片片段標記"大帥哥"之處 ! 也可能寫成 gotoAndPlay(38); 表示要跳去播放第 38 影格, 或寫 gotoAndStop(49); 表示要停在第49影格。 ***第三句是告訴系統說: 如果 ggyy 發生了 "某事件", 請立刻叫 處理函數 做事! 或者說, 如果 "某事件" 發生在 ggyy 身上, 請立刻叫 處理函數 做事! 例如: (此處把"處理函數"改用英文 him 取代) ggyy.addEventListener(flash.events.MouseEvent.CLICK, him); 這句表示如果使用者用滑鼠按了一下 (CLICK) ggyy 這物件, 那就把某件事這事件(Event)交給函數 him(事件) 去處理; 也就是"某件事"這物件會當作參數傳給 him( ) 函數! 然後 him(e: 事件) 這函數內就可以根據接收到的參數 e 檢視其內容以便決定做何事。 當然也可能根本不檢視傳入的事件 e, 就做想做的事, 例如這是最簡單的 him( )函數: function him(e: Event) { gotoAndStop(1); // 跳到整個動畫影片最開始 } 這樣, 只要使用者點按下 ggyy (應該是個按鈕元件實體), 就會跳到整個動畫影片最開始。 以上這些程序就是所謂的註冊監聽器(Listener, 偵聽器), 註冊之後,系統會一直幫我們監看(監聽)著 ggyy 這個物件(通常是按鈕), 即使繼續播放其他影格,此監聽命令也同樣持續有效; 所以, 如果你不想繼續監聽, 就必須撤回剛剛的註冊, 這很簡單,只要把剛剛那句的 add 換成 remove 即可: ggyy.removeEventListener("某事件", 處理函數);
為何一下 him, 一下 him( ), 一下 him(e: 事件) ?
    其實這都是在講同一個函數, 一般我們寫 him( ) 表示這 him 是函數名稱,
如果只寫 him 則可能被誤會 him 是變數(variable), 但通常可從文章前後文看出是在講蝦密碗糕 :-)
至於寫 him( Event ) 則表示 him 這函數需要一個參數(Parameter), 且參數型別是 Event(事件);
如果這是函數的頭(prototype; 雛形)則應該寫成 function him(e: Event) { /*...*/ } 
啥? 你看到的是 function him(e: MouseEvent) { /*...*/ } 
那正確啊! 只是強調是滑鼠事件(MouseEvent), 因為滑鼠事件也是事件, 所以在參數偷懶寫 Event 也正確。
至於 ggyy 是啥呢? ggyy 是舞台上的某個實體元件(symbol instance)的名稱, 同時也是程式中的一個變數(Variable)。 (或是影片片段內的某影格舞台上的實體物件名稱) 注意: Flash影片在舞台上直接畫的圖畫不能給實體名稱! 圖像元件的實體也不能給實體名稱! 實際上, Flash 在舞台上的任何東西除了 TLF 文字物件可以直接給實體名稱之外, 必須是元件庫中某個元件(Symbol)的分身才可給實體名稱, 所謂元件的分身就是其一份複製實體(instance), 如果是圖像(Graphics)元件則其分身實體仍不能命名, 要轉為影片片段(MovieClip)後的分身才可以命名 ! 另外, 也注意實體名稱的命名與元件庫中的命名是不一樣的, 在元件庫中各元件名稱可以使用中文不會有問題, 因為元件庫中的元件不會被程式直接使用。 這裡故意取名叫做 ggyy 只是要讓你知道名稱可以亂取, 但是這樣很不好, 強烈建議最好遵守命名慣例(naming convention), 以後你就會知道遵守慣例有很多好處 :-) 注意: 舞台(Stage)上的物件必須是元件庫內某個元件的實體(instance; 案例; 分身)才可以命名, 而且圖像元件的實體仍無法命名, 必須是影片片段MovieClip或是按鈕Button元件的實體才可以命名。 正確說應該還有 TLF 文字也可以命名, 連同影片片段實體, 以及按鈕的實體共三種物件可以取名稱。 ggyy 也是程式中的變數, 那變數到底是蝦密碗糕呢? 變數(Variable)顧名思義就是會變的數啦, 就是會佔用一塊記憶體, 我們給它一個名稱, 常用的變數在 Flash 有整數變數 int, 數值變數 Number(包括實數與整數), 布林變數(Boolean), 以及字串變數 String, 甚至各種物件的變數, 例如 MovieClip, SimpleButton等等。 等下再與條件式(conditional expression)以及運算式(expression)一起討論。 如果你急著要看看, 可以點這看更多關於變數的討論。(看完可按視窗左上角的回到這) 要注意雖然 Flash 與 Java 越來像, 但 Flash 的變數型別(type)與 Java 語言不太一樣喔 ! 運算的規定也不太一樣, 主要是例如 9/2 這在 Flash AS3 得到 4.5, 但在 Java 語言卻是整數 4 喔! 應該說 C, C++, C#, 以及 Java 都規定 9/2 是整數 4, 所以如果你學過其它語言要特別注意雖然 Flash 的ActionScript 3.0是以 Java 語言為基礎, 但還是略有不同。 事件(Event)是蝦密碗糕 ? 在真實世界, 每分每秒都在發生某事件, 例如有人戳你一下是個事件, 有人大叫也是個事件, 下雨是個事件, 發生車禍也是個事件; 通常不同的人處理事件的方法也不盡相同! 我們先回頭再談談程式設計概念, 稍後再來談談Flash認得的滑鼠事件以及其他一大堆的事件。 剛剛提到的 "某事件" 是某種 Event (事件), 用一個字串(String)表示, 但有時為了方便程式人員記住, 都定義成一個全大寫的符號常數, 例如, flash.events.Event.ENTER_FRAME 其實代表 "enterFrame" 這字串, 正確的說, 在 flash.events 這目錄內有個類別 Event.class, 該類別裡面定義了一個字串常數如下: public static final String ENTER_FRAME = "enterFrame"; 我們通常用到這 "enterFrame" (進入影格;目前版本一秒鐘會進入影格24次)之時程式碼如下: import flash.events.Event; // 讓系統知道是用到哪一個 Event 類別 ggyy.addEventListener(Event.ENTER_FRAME, 處理函數); 請注意Flash的事件註冊方式與Java略有差異(Flash比較單純化), Java語言因為規定任何函數不可以獨立存在, 必須放在某個類別, 所以註冊事件處理之時參數只有一個, 且必須是有能力處理類事件之類別的實體物件, 例如有個類別叫 Cat 有 implements MouseListener, 則假設有個按鈕 btn 需要被監控滑鼠事件, 要這樣寫: btn.addMouseListener( new Cat( ) ); // Java 用法 當然在 Cat 類別內必須把所有與 MouseEvent 有關的處理函數都寫好(名稱是規定好的!) 但是在 Flash 比較直覺, 註冊不是用整大類(class)的事件, 是以單一的事件, 針對每個單一的事件註冊給某個處理函數! 所以 Flash 的註冊函數只有一個: addEventListener( 事件, 函數); 不像 Java 語言很複雜, 一大堆的 addXXXListener(物件); 這裡的 XXX 為事件的類別。

 Top
為何說程式設計很簡單 ? 真的很簡單, 其實你小時候就已經寫過, 跟你老媽或老爸一起寫過 :-) 真的嗎? 當然真的!當時可能你老媽發現家裡沒糖了, 等會兒做菜要用到糖, 於是:

  媽媽: 小虎你拿桌上一百塊去路口雜貨店買糖回來 !
  小虎: 買什麼糖啊?
  媽媽: 黑糖
  小虎: 阿如果沒有黑糖呢?  // 小虎未雨綢繆ㄟ :-) 
  媽媽: 那就買 白砂糖
  小虎: 阿如果沒有白砂糖呢?  // 小虎想得真週到 :-) 
  媽媽: 那就改買豐年果糖啊   // 小虎這傢伙怎跟他老爸一樣囉嗦 
  小虎: 阿如果沒有豐年果糖呢?  // 馬總統說世事難料啊! 
  媽媽: 那你就不要回來啦!    // 媽媽生氣不耐煩了 :-(( 
  小虎: 好吧.. 那我出門囉...
很熟悉的場景吧 ?
於是你與你老媽共同寫下了一個程式(program, 計畫, 規劃):


    帶著100元走路去雜貨店;
    if(店裡有黑糖) 買黑糖;    //  if 就是 "假如" 
    else if(店裡有白砂糖) 買白砂糖;
    else if(店裡有豐年果糖) 買豐年果糖;
    else 不要回家了;    // 先跑去同學家躲一陣子順便玩遊戲機 :-) 
    走路回家;    // 買完後總要走回家啊 


看到沒? 你以前小時候就寫過程式了ㄟ!
    其實應該說當時你老媽可能想要執行另一個別人寫的程式: 食譜
沒錯, 食譜 也算是一種程式, 是有經驗的廚師設計的,
原則上任何人只要根據該食譜就可以做出同樣的菜來 :-)
當時卻發現少了一樣重要的素材: , 於是規劃設計出讓小虎你
去執行的這個小程式:去買糖!
觀念上可以把這小程式看作是一個函數(function; 函式), 函數又稱作動作(Action)或方法(Method)。
既然這樣, 來把它寫得更像Flash的函數:

  function 去買糖(money: int) : int
  {
    var 剩下的錢: int = money;
    帶著剩下的錢走路去雜貨店;   // 此時 剩下的錢 就是一開始的參數 money
    if(店裡有黑糖) {
         買黑糖;    //  if 就是 "假如" 
         剩下的錢 = 剩下的錢 - 買黑糖的錢;
      }
    else if(店裡有白砂糖) {
         買白砂糖;
         剩下的錢  -=  買白砂糖的錢;    // -= 代表 "扣掉"
    }else if(店裡有豐年果糖) {
         買豐年果糖;
         剩下的錢  -=  買豐年果糖的錢;
    }else 不要回家了;    // 先跑去同學家躲一陣子順便玩遊戲機 :-) 
    走路回家;    // 買完後總要走回家啊 
    return 剩下的錢;   // 回傳給老媽 :-)
  }  // 函數(函式)結束


   你可能是好奇寶寶, 立刻很想知道這個 if 敘述 (if statement)的語法?
其實就跟你平常講話一樣, 先看最簡單的:
    if (條件式) 做一件事;
但是, 有時可能想做的不止一件事, 那就:
    if (條件式) {
       做一件事; 
       ... 愛做幾件就做幾件 :-) 
       ... 不過如果太多件可以考慮包裝成一個函數, 這邊只要叫用該函數(function; 函式)
    } 
最標準的 if 敘述如下: 
    if (條件式) {
        //符合條件時就執行這裡的程式,太多句就考慮用函數。
    } else {
        //不符合條件時,執行這裡的程式。
    } 

至於最複雜的已經在上面被你拿去買糖了 :-)

 Top
阿那個 "條件式" 怎麼寫呢? ㄟ.. 阿就是跟平常比關係與邏輯差不多啦, 包括大於(>), 小於( < ), 等於(==)或不相等(!=), 甚至"or或者( || )" 與 "and而且(&&)" 以及 "not不是那樣(!)"; 只是要注意在程式碼中的寫法與平常不太一樣: 是否相等 == 例如 if(cake.x == mouseX) 太神奇了; 不相等 != 例如 if(e.target.name != "cake_mc") gotoAndStop(38); 而且 && 例如 if((a > b) && (b > c)) god = a; 或者 || 例如 if((a > b) || (a > c)) myMax = a; 不是 ! (驚嘆號) 例如 if(!isDoorOpen) gotoAndPlay("開門"); 所有的條件式得到的結果就是"對"(true; 真)"不對"(false; 否), 這種只有對或不對的答案我們稱之為布林值(Boolean)。 註: 注意 Java 語言如果要比較兩字串內容是否相等必須寫這樣: if(strOne.equals(strTwo)) ... 但在 Flash 的 ActionScript 3.0 則直接用 == 比較兩字串即可(Python 也是用 == 即可)! 其實我們應該再談談運算式(Expression), 這樣會讓你更了解條件式(即條件運算式)。 運算式(Expression)與條件運算式(Conditional Expression) 剛剛說的條件式全名是條件運算式(conditional expression), 是運算式(expression)的一種, 運算式顧名思義就是一個計算式, 最簡單的就是用加減乘除(+-*/)把變數或常數做計算, 要注意的是乘法用星號(*), 除法用斜線(/), 原則上先乘除後加減, 但如果你希望哪部份先做 阿就用小括號把它夾起來, 例如: var x: Number = 23/(2+1); // Flash AS3 這樣寫是把 23/3 答案放入實數 x 或是 Java 語言這樣寫: double x = 23/(2+1); // Java 這樣是把答案 7.0 放入實數 x 眼尖的同學可能會說 23/3 怎會是 7 ? 在 Java 語言確實是 7 喔! 這是因為 Java 語言規定 計算的時候如果運算符號(operator; 又翻譯為運算子)的左右兩邊都是整數則算完後小數部份全部捨棄, 注意, 不是四捨五入喔, 是無條件捨棄, 所以如果算出是 7.999 則答案是 7 不是 8 喔。 但是在 Flash AS3 則會先轉為實數再計算, 所以 Flash AS3 的 23/3 是 7.666666...6667 這裡的 ... 是很多個 6 啦!那你可能又要問為何最後是 7 呢? 因為在電腦裡面其實是二進位, 而且是有限的二進位(Number用64位; 64 bits), 所以無限循環小數放到電腦會被四捨五入(其實二進位是0捨1入:-), 這部分比較難就留給資工系的同學去傷腦筋就可以了:-)   一般把運算式(expression)分為三種: (a)數學運算式(Mathmatical expression), (b)關係運算式(Relational expression), 以及 (c)邏輯運算式(Logical expression), 咦? 那條件運算式呢? 怎沒在裡面? 別緊張, 剛剛說的關係運算式與邏輯運算式就合稱條件運算式(conditional expression)啦, 簡稱條件式。 (註: 其實 C 語言可以把數學運算式也當作條件運算式, 代表是否 != 0 不等於0 就是 True) (a)數學運算式就是剛剛說的用加減乘除(+-*/)把變數或常數做計算, 其實數學運算不止這四個運算符號(operator; 又翻譯為運算子), 各家電腦語言大都抄襲 C 語言的運算子, 關於Flash AS3 的運算符號請點這連過去看(開新窗)。 設定值(assignment)的等號 (=) 可以搭配各種數學運算, 改變等號左邊的變數內容, 最常用的是 += (加進去) 與 -= (扣掉), 例如假設變數 x 原先內容是 29, 則 x+=9;x= x+9; 都是讓 x 變成 38, x = x +9; 意思是把 x 原先的內容抓出來與 9 相加之後放回去 x, 注意這裡的等號 = 並不是說 x 與 x+9 會相等(廢話! 加了酒怎會相等?)。 x += 9; 意思是把 9 加入到 x, 這種寫法與講法更為自然。 同樣的, 如果原來變數 x 是 58, 則 x -= 9; 將會使 x 變成 49, 也就是與 x = x -9; 做同樣的事。 (b)關係運算式就是比大小, 小於 < 和大於 > 與平常用法相同, 但是是否相等用 == (兩個等號); 注意一個等號(=)已經用於"指定值(assignment)"), 表示把等號右邊的答案放到等號左邊的變數。 是否不相等則用 != (驚嘆號連著等號), 另外 <= 是小於或等於, >= 是大於或等於。 (c)邏輯運算式則是指把關係運算式用邏輯的 && (代表而且and), || (代表或者or)連起來, 或是在關係運算式或邏輯運算式左邊寫一個驚嘆號 ! 代表反過來或者說代表"不是"; 記住一個原則, 當你搞不清楚運算符號的優先順序(operator precedence)時, 也就是說不知道哪個運算符號會先做, 那就利用小括號夾住你要它先做的部份就是啦。 還有, 請儘量遵守程式撰寫慣例, 可以看看 Java 語言推薦的程式風格撰寫慣例(開新窗)。 為何需要條件式? 因為油電雙漲啊.. 阿不是, 我是說因為世事難料啦:-) 如前面例子說的, 還沒到雜貨店哪知道該店有沒有黑糖呢? 同樣的, 在規劃程式之時, 也要預先儘量把各種不同情況考慮到, 不同情況做不同的事情, 這就是條件式發揮功能的時候啦, 但必須搭配控制指述(Control Statement; 控制敘述) 控制指述(Control statement; 控制敘述) 條件式(條件運算式)通常用來控制程式的流程(flow), 讓程式在執行時依據事先規劃的路徑走, 也就是搭配控制指述(Control Statement; 控制敘述), 不同情況就做 (執行; execute)不同段落的程式碼。 電腦語言的控制敘述也很簡單, 前面討論很多的 if (如果)是最常用的, 跟小孩喜歡問為什麼不謀而合:-) 連續的 if 常常改用 switch.. case 敘述代替, 但 switch 的條件式只能是整數(Flash 也可以是字串), 所以有些情況比較複雜時仍需用連續的 if 來完成。以下是一個簡單的 switch .. case 敘述:

     // Flash 監聽程式範例
     function her(ev: MouseEvent)  {
           var who:String = ev.target.name;  // ev 是一個事件 (Event)
           //switch ... case 是 C 語言發明的, 原先的 case 只能是整數,
           //但在 Flash 的 switch case 比較厲害,
           //也可以是文字串(String)! 
           trace("滑鼠按到了: " + who);
           switch(who) {
              case "aa":
                 trace("你按了 aa");
                 gotoAndPlay(2);   // 跳到第 2 格並繼續播放
                 break;  // 重要 ! 不要忘了 break; 
              case "bb":
                 gotoAndStop(2);
                 break;  // 重要 !
              case "cc":
                 trace("李麥欉蝦密啦?");
                 // 看你按了 "cc" 按鈕要做何事
                 break;  // 重要 !
              case "gg":
                 fscommand("fullScreen", true); //全螢幕! 要用 Flash 播放才有用!
                 break;  // 重要 !
              default:  // 其他
                 fscommand("quit");  // 這是隨便寫啦! 會關閉 Flash 動畫喔
           }// switch..
    } // function
如何重複做相同或類似的事很多次 再來你可能需要重複做一段事很多次, 可以用 forwhiledo .. while 敘述, 其實只要一招 for 就可以走遍天下 :-) 用 for 做 n 次, n 是整數, 可直接寫常數: for(var i: int=0; i < 9; ++i) { trace("i=" + i); // ...做事, i=0, 1, 2, .. 8 } 也是用 for 做 n 次, n 是整數, 故意有用到 n: var n: int = 9; for(var i: int=1; i <= n; ++i) { // n 在 Loop 外面定義為整數變數 trace("i=" + i); // ...做事, i= 1, 2, .. 8, 9 } 注意上面兩個 for 雖然都是做九次, 可是前者是 0 到 8, 後者是 1 到 9, 注意迴圈繼續做的條件 迴圈(Loop)通常搭配陣列 (Array) 用 for 做不知道幾次, 是根據陣列長度: var objArr : Array = new Array("cream", "kiwi", "straw", "peach", "candle"); for(var i: int = 0; i < objArr.length; ++i) { // 陣列 objArr 長度改變這裡也不必改 ! try{ var mc: MovieClip = getChildByName(objArr[i]) as MovieClip; mc.buttonMode = true; mc.useHandCursor = true; // 出現手 mc.addEventListener(MouseEvent.MOUSE_DOWN, onSelectObject); }catch(e: Error) {;} } 雖然一招 for 就已經足夠做所有需要重複做的迴圈(Loop), 但有時改用 while 會比較自然! 例如問你要吃幾碗飯, 你如果說三碗, 那用 for 當然很適合, 但如果你說啊哉? 要吃到飽啊! 那其實比較好的寫法是用 while: while( 沒有飽 ) { // ALL you can Eat ! 隨你吃到飽囉 // 吃 // 喘一下 } 以下我們把剛剛的 for 迴圈改用 while 來寫, 請注意變數的起始值以及何時更改控制迴圈的變數。 建議每次要用較少次數測試看看, 因為很容易不小心想錯導致多做一次或少做一次。 用 while 做9 次, 0..8: var n: int = 9; var i: int = 0; while( i < n ) { trace("i=" + i); // ...做事, i=0, 1, 2, .. 8 } 也是用 while 做9 次, 1..9: var n: int = 9; var i: int = 1; // 注意這 while( i <= n ) { // 注意這是 小於或等於 n 都要做 trace("i=" + i); // ...做事, i= 1, 2, .. 8, 9 } 改用 for 做 while 的事:( 迴圈一開始就要檢查是否該break離開 ) var n: int = 9; var i: int = 1; // 注意這 for( ; ;) { // Loop forever if( i > n) break; // break 就是離開 Loop trace("i=" + i); // ...做事, i= 1, 2, .. 8, 9 } 其實 for 與 while 是互通的, 通常圖比較容易懂, 因為可以用一隻眼睛看(一目了然:-), 所以我們來看看 for 與 while 的寫法以及其流程圖: 再來看看這個吃到飽的流程圖: 請注意, break; 是離開迴圈(Loop), 但 continue; 是雖然不繼續目前這回合 (pass), 卻仍要繼續(continue)下一個回合(pass) !! 所以說 continue 就是不 continue, 很玄吧:-) 其實, 有了break;continue; 搭配測試條件的 if 以及一個永遠的 for 迴圈, 就真的可以一招走天下(只用這招做控制做很多次):
    var n: int = 58;
    var i: int = -1;  // 因為一進入 for Loop 我們要立刻 +1, 這樣會從 0 開始!
    for( ; ; ) {  // 這樣寫就是 Loop forever 永遠的迴圈; 與 while(true) { 完全相同
        ++i;      // 第一次到這則 i 會變成 0 
        trace("i= " + i);  // 印出 i
        if( i == 8 ) continue;   // 如果 i 等於 8 立刻回到 for 的頭繼續下一個回合
        //... 做事    , 注意若 i 等於 8 不會到這喔!
        if(i >= n) break;     // 如果 i 已經等於 n (即 58)或大於 n (其實不可能 !)就離開迴圈
    }
    trace(" for 迴圈結束後的 i =" + i);
小提醒:  for( ; ; )while(true)  功能完全相同            
注意 if( 條件式 ) break; if( 條件式 )continue; 的檢查可以在 for 迴圈內任何地方進行, 這樣就可以做出與前面各個 for 與 while 的例子完全一樣的效果。 例如, 以下就是與 for 做 9 次(i 從 0 做到 8)完全一樣但用永遠的 for 迴圈:
    var i: int = 0;  // 從 0 開始!
    for( ; ; ) {   // 這樣寫就是 Loop forever 永遠的迴圈; 與 while(true) { 完全相同
        if(i > 8) break;     // 如果 i 已經等大於 8 就離開迴圈, 那一定是 9 囉
        trace("i= " + i);  // 印出 i
        //... 做事    
        ++i;   // 別忘了這喔
    }
    trace(" for 迴圈結束後的 i =" + i);  // 此例一定是 9, 表示迴圈內部印出 0, 1, .. 到 8   
好了, 這樣已經夠用了(其實已經太多:-),其他像 do .. while 等有的沒的控制敘述就不要管它了。 還有, Java 語言與上面的 Flash AS3 各例子唯一的差別就是變數宣告的寫法不同 ! 例如, 只要把 var i: int = 改寫為 int i = 就可以啦。
    這樣真的夠用了嗎?
真的啦, 你看那作曲家不過就是把 1 2 3 4 5 6 7 兜來兜去, 就可以搞出那麼多曲子,
阿程式設計當然也只要幾句兜來兜去就很厲害了:-)
變數(Variable)到底是啥密碗糕? 阿啥是變數(Variable)呢? 前面舉例 ggyy 已經講過變數, 再來複習一下:-) 變數, 顧名思義就是會變的數啦, 就是會佔用一塊記憶體, 我們給它一個名稱, 常用的變數在 Flash 有整數變數 int, 數值變數 Number(包括實數與整數), 布林變數(Boolean), 以及字串變數 String, 甚至各種物件的變數, 例如 MovieClip, SimpleButton等等。 (注意 Flash 的變數型別(type)與 Java 語言不太一樣喔 ! 例如 Number 是 Java 的 double) 例如: var gg: MovieClip; // gg 這變數是一個影片片段 var kk: int = 38; // kk 這變數是一個整數, 初始值 38 var open_btn: SimpleButton; // open_btn 是一個按鈕 var tmr: Timer = new Timer(1000, 8); // 計時器每秒一次, 數8次 var myMsg: String = "我懂了ㄟ!"; // 字串 kk = stage.width - cake.x; // 這是運算式(expression) 關於變數(variable)與運算式(expression, 表示式)就先知道這些就好了 ! 若急著想知道
變數的命名規則, 可以點這看看關於變數命名慣例與實體名稱命名建議。(會換掉此頁; 按左上角可回到此頁)

 Top
有點概念了吧? 
接下來我們繼續探討 Flash 可以認識的事件, 在六十幾類事件(Event 的子類別有六十幾個!)中,
最常見的就是滑鼠事件(MouseEvent)這類事件囉。

  

滑鼠事件(MouseEvent) 有哪些 ? 
    通常使用者會用滑鼠與我們的Flash影片或動畫互動,
所以Flash程式中最常用的就是滑鼠事件了, 如果是手機(要安裝Adobe AIR)則是手指觸控事件。
滑鼠事件(MouseEvent)是一個類別, 其完整名稱是:
    flash.events.MouseEvent.class

目前這個類別內共定義了十七種滑鼠事件(也就是說 MouseEvent 這 class(類別)內定義了17種滑鼠事件!),
以下列出常用的八種滑鼠事件:

    flash.events.MouseEvent.OVER           滑鼠滑入

    flash.events.MouseEvent.MOUSE_DOWN     滑鼠按下
    flash.events.MouseEvent.MOUSE_UP       滑鼠放開

    flash.events.MouseEvent.CLICK          滑鼠按一下
    flash.events.MouseEvent.RIGHT_CLICK    滑鼠右鍵按一下

    flash.events.MouseEvent.OUT            滑鼠滑出
    flash.events.MouseEvent.MOUSE_MOVE     滑鼠移動

    flash.events.MouseEvent.MOUSE_WHEEL    滑鼠滾輪事件


滑鼠事件之外還有啥事件(Event)? 
    應該說到底可能發生甚麼事?
你想浪費時間去追根究底了解所有的Flash事件? 
也就是整個 flash.events 套件(package)內有哪些類別? 各類別內又有幾種不同事件 ?
    蔡神要告訴你"賣憨啦!" (台語, == 別傻了啦 == Don't be silly !)
因為這是不需要且很浪費時間的一件傻事! 重要的是概念! 知道大概的概念就可以啦!
當然, 如果你很好奇則可以隨便看看相關API手冊, 也不必仔細看啦 :-)

    請注意, 上面我們只是把"滑鼠事件"(MouseEvent)這類別的常用事件列出,
其實光是滑鼠事件這類(class)就有十七種事件, 
而滑鼠事件(MouseEvent)只是六十幾個事件類別(從 Event 衍生出六十幾種類別)中的一類,
所有這六十幾個類別(class)被放在同一個目錄 flash\events 內, 在ActionScript3.0這個
程式語言稱作 flash.events 套件(package), 所以我們常說 package 套件必須反應目錄架構;
意思是如果套件 package 是 ggg.yyy; 則必須放在目錄 ggg 之下的子目錄 yyy 內!
你可以點看以下官方網址查看所有這六十幾種事件類別(Event class):
  http://help.adobe.com/zh_TW/FlashPlatform/reference/actionscript/3/flash/events/package-detail.html

如果你只想看看有哪些滑鼠事件(MouseEvent),
請點看以下網址: 
 http://help.adobe.com/zh_TW/FlashPlatform/reference/actionscript/3/flash/events/MouseEvent.html#constantSummary

    滑鼠事件是由使用者引起的, 有一個最常發生但不是使用者引起的事件,
其全名如下:
    flash.events.Event.ENTER_FRAME 
如果你去查手冊, 你會發現它是一個字串常數 "enterFrame",
這個事件目前的Flash版本每秒會自動發出 24 次(早期版本每秒12次),
原因是Flash播放影片的速率是每秒24個影格, 剛好符合肉眼視覺暫留的效果。
請注意, 即使畫面看起來沒在動, Flash 仍會以每秒24個畫面的速度進行播放,
所以, 這個 ENTER_FRAME 的事件是每二十四分之一秒會發生一次。如果你希望每
當一個畫面要播放或者說每24分之一秒要做一件事, 就可以利用註冊監聽這個事件。
如果你需要更精準的時間, 例如每秒要做一次, 或每秒要做十次甚至一百次,
那你必須利用計時器類別 flash.utils.Timer 所發出的 TimerEvent (flash.events.TimerEvent),
也就是像你在真實世界去買個可以設定時間的計時器, 時間到就發出時間事件:
    Timer timer = new Timer(多久發一次事件, 總共要發出幾次);
    Timer myTr = new Timer(100, 58);  // 每千分之100秒一次, 總共要 58 次 
上面第二列會創建一個計時器 myTr (等於去買來一個計時器), 設定為每十分之一秒"叫一次", 總共會叫58次;
也就是說, 該計時器每次時間到就會發出 TimerEvent.TIMER 事件,
達到總共要發出幾次的次數則會發出 TimerEvent.TIMER_COMPLETE 的事件;
因此, 你可以充分利用註冊監聽該兩個計時器事件做一些不斷需要做的事, 例如:
    myTr.addEventListener(TimerEvent.TIMER, him);  // 根據前面計時器是每秒十次
    myTr.addEventListener(TimerEvent.TIMER_COMPLETE, you); // 計時結束 
注意, 註冊完之後, 別忘了要啟動計時器:
    myTr.start( ); 
不然你等於買了計時器卻沒裝上電池 :-)
上述兩句註冊監聽搭配前面 new Timer(100, 58) 的意思是說每十分之一秒會叫用函數 him( ) 一次, 總共會叫用 58 次,
第58次數完之後, 會叫用函數 you( ) 一次;
當然, 如果還沒達到發出 TimerEvent.TIMER 58次之前你撤銷了監聽註冊:
    myTr.removeEventListener(TimerEvent.TIMER, him);  // 撤銷監聽

那就不會繼續叫用 him( ) 這函數; 
不過, 要注意 myTr 這 Timer 仍會繼續數, 直到數完58次還是會發出TimerEvent.TIMER_COMPLETE事件
你有兩個方法可以撤銷這個監聽命令, 第一個方法跟剛剛一樣: 
    myTr.removeEventListener(TimerEvent.TIMER_COMPLETE, you);
  第二個方法就是直接把計時器 myTr 停掉: 
    myTr.stop( ); 
因為, 既然計時器都停了, 那些監聽註冊自然失效 :-)

    事件也可以是自己定義的事件, 名稱是自己定義的任意字串, 甚至還可以取中文喔 :-)
自己定義的事件註冊捕捉事件時只要使用字串表示,
但發出事件則要使用如下句子: 
      dispatchEvent(new Event("你的事件名稱"));

    這裡  new Event( )  是製造出一個事件(也是一個物件),
然後由 dispatchEvent( 事件物件 ); 這個方法(Method, 又稱函數function)把事件丟出去(發出去)。
所以稱作"丟出去"是因為 C++ 和 Java 都是使用 throw 把事件發出去!!
      dispatchEvent( 事件物件 ) 這個函數(方法)是寫在 IEventDispatcher 這個介面(Interface)裡面,
關於該函數詳細的說明請看以下網址:
 http://help.adobe.com/zh_TW/FlashPlatform/reference/actionscript/3/flash/events/EventDispatcher.html#dispatchEvent()
因為幾乎所有的類別都直接或間接實作(implement)了該介面, 所以幾乎所有物件都可使用該函數發出事件。
簡單的說, 你想發出事件就寫該句子, 如果 Flash 編譯器說有問題再來研究 :-)



 Top
回來繼續探討怎麼寫 Flash 的簡單程式!
既然說如果發生"某事件"就要請 處理函數 做事, 那我們就必須把 處理函數 準備好, 你可以寫在這影格之前, 或直接寫在該句下方即可: stop( ); ggyy.addEventListener("某事件", 處理函數); function 處理函數(e: Event) { // 處理函數的名稱必須是英文, 第一個字母請用小寫 // 做事... } 通常要做的事情也不多, 你只要知道幾句常用的以及有一點點邏輯概念即可! 甚麼邏輯概念喔? 阿就是要會像這樣: 如果(下雨了) 打開雨傘( ); // 注意尾巴有括號表示是方法(或稱為動作或函數) else 大聲叫出("我要乘風破浪!"); // 顯然 大聲叫出 也是函數 然後翻譯為英文(歹勢, 不支援用中文文法寫程式:-) if( isRaining ) openUmbrella( ); // openUmbrella( ) 是一個方法或稱函數(函式) else cry("我要乘風破浪!"); // cry 也是一個函數, 接受一個字串當作參數(給它用的資料) 現在寫一個簡單的範例:

    stop( );
    var kk: int = 0;   // 記憶體放個變數 kk, 是整數,  先放入 0
    addEventListener(flash.events.Event.ENTER_FRAME, haha); 
    function haha(e: Event) {  // haha是 處理函數 名稱, 第一個字母請用小寫
        ++kk;  // 每次加 1
        if(kk > 50) nextFrame( );  // 如果 kk 大於 50 就跳到下一個影格
    }
上面這個程式會使得目前這影格停留大約 2 秒之後進入下一個影格! Why 這樣就會停大約兩秒 ? 因為 stop( ); 使其停在目前影格, 可是目前的 Flash 版本每秒鐘播放24個影格(24fps), 所以每 24 分之一秒會發出一次的 flash.events.Event.ENTER_FRAME 事件, 這使得 haha( ) 這函數每秒會被執行大約24次, 所以當 kk 累積到 51 之時因為大於 50 就會執行 nextFrame( ); 這函數! 此時大約 2 秒多一點點, 因為 51/24 大約 2.1, 所以大約2秒; 所執行的nextFrame( );是內建的函數(也可以說是Flash的命令), 會使得播放磁頭移往下一個影格(Frame)! 如果你把 nextFrame( ); 改為 nextScene( ); 則會跳到下一個場景(Scene)的第一個影格! 又, 如果你把 nextFrame( ); 改為 gotoAndStop(38); 則會跳到總影格的第 38 影格並停在該影格。 所謂總影格意思是從第一場景的第一影格數 1, 不分場景, 連起來一直往下數到第38影格。 如果你是用 gotoAndPlay(38);則是跳到總影格第38影格並繼續播放! 當然, 如果你在第38影格某個圖層有寫 stop( ); 則會停在該影格!
有點概念了吧? 前面說過, 撰寫程式(programming)就好像你要教一個很聽話但沒主見的小孩子(電腦)做事, 你說甚麼他就做甚麼, 完全照你的"規劃"(program; 計畫, 又翻譯為程式)一步一步做! 只是因為電腦很快, 於是就可以做出看起來很厲害的事情了。

 Top
函數(Function)是甚麼碗糕? 為了方便, 把幾句命令集合在一起, 給他取個名字, 以後方便使用, 這就是函數了; 習慣上函數名稱的後面有一對小括號, 裡面夾著 0 個到很多個參數(Parameter)。 其實前面已經談到很多關於函數的議題, 前面一開始寫的 him( ) 或是內建的 nextFrame( ) 以及 移動播放頭的 gotoAndStop( ) 與 gotoAndPlay( ) 都是函數(function; 函式)。 撰寫程式一定要善用立法委員包工程的概念與大哥叫小弟做事的概念! 爹公蝦密咧? 立委包了工程大部分都是轉包出去(函數:-), 大哥出一張嘴巴也都叫小弟(也是函數)去做事! 甚至有錢人家裡請許多外勞(有算是函數)幫忙做事! 所以我們可以把工作拆解為許多函數, 然後只要依序叫用各個函數就可以完成我們要的工作了。 請注意, 函數(Function; 函式; 又稱 Method, 方法)自己不會自動執行, 整個函數可被當作一個命令使用, 用到了才會跳過來進入函數執行, 函數結束又回到叫用它的敘述之下繼續執行, 使用函數很簡單, 只要寫函數名稱接著一對小括號( ), 例如 gotoAndStop(38); 小括號內可以放 0 個到很多個參數(argument; 引數)以便傳入函數內讓函數參考! 剛剛提到的參數(Parameter), 在使用函數者把要傳過去的稱 argument (引數), 在接受參數的函數頭部則稱之為 parameter (參數), 或稱 formal parameter (形式參數); 不過一般都是通稱參數(Parameter)。 以下是叫用 myCntDown 所屬類別的 start 函數: myCntDown.start(8, "時間到"); 這句傳了兩個參數(引數)過去, 第一個 8 是整數, 應該是希望倒數八秒, 第二個參數是字串"時間到", 應該是希望算完發出(dispatch)一個"時間到"事件 (Event)。 當然, 在 myCntDown 所屬的類別(class)裡面一定要有可接受該兩參數的 start(int, String)函數。 函數(function; 又翻譯為函式), 又通稱為方法(Method), 代表一連串動作(Action), 或者說代表一系列的行為(behavior), Flash 規定函數的寫法一定是用關鍵字function 開頭, 然後是你的函數名稱, 接著用括號夾住 0 個到多個參數(parameter), 如果是註冊用來處理某事件用的函數, 則一定要有一個參數, 例如一開始的 him( ); 且其型別(type)一定是 Event 或是 Event 的子類別(sub class), 例如 MouseEvent(滑鼠事件) 便是 Event 眾多子類別中的一種。 然後是可有可無的 : returnType 代表要回傳啥資料? (上面例子因沒寫, 相當於寫 : void 代表不必回傳任何資料!) 最後則是用一對大括號 { } 夾住一系列的命令或句子函數名稱通常可以隨便取, 但請遵守函數與變數的命名慣例(開新窗)。 請注意, 有些語言或遊戲引擎採用 Framework 的概念, 就是函數名稱是規定死的, 例如 Java 語言的事件處理函數, 名稱都是固定的, 連大小寫以及參數型別和數量都必須照規定; 又如Unity遊戲引擎, 最常寫的函數是 Update, Start, 總共有五十幾個規定好名稱但我們可以寫的函數, 要注意 Unity 函數命名習慣不同, 我們可以重寫蓋掉的該五十幾個函數名稱第一個字母都是大寫。 更多關於 Unity遊戲引擎所用腳本語言API可點這連過去看(開新窗) 世事真的難料要預防意外(Exception Handling) 前面我們說在"規劃"讓電腦做事已經會考慮不同情況, 所以會善用 if 敘述事先規劃不同情況做不同的事情。 但是, 有時會發現世事真的難料, 某段程式可能因考慮不週會在執行階段出槌導致程式當掉! 為了避免程式死得不 明不白, 我們可以採去預防措施, 以下是 Flash 程式的寫法:

      try {
         //... 這是可能出槌的程式碼
         //.. 夠認真應該一個 try block 只夾住一句可疑的敘述     
         //.. 偷懶就夾住一整段 :-)
      }catch( e: Error) {
         trace("有問題囉 ... ");
      }
如果是 Java 程式, 則應該這樣寫:

      try {
         //... 這是可能出槌的程式碼
         //.. 夠認真應該一個 try block 只夾住一句可疑的敘述
         //.. 偷懶就夾住一整段 :-)
      }catch(Exception  e) {
          System.err.println("有問題囉 ... ");
          e.printStackTrace( );
          // Log.d("某處", "發生了問題 ...");   // 這是 Android 的 Java 
      }
這種事先無法利用 if 把問題或狀況排除, 只好用 try block 夾住一段可能出問題之程式碼的做法有個專有名詞, 稱作例外處理(Exception handling; 意外處理; 異常處理)。有了這招, 我們就可確保程式只要編譯階段沒有錯, 就 不會在執行階段 (Run time)當掉, 不過請注意, 不會當掉不表示沒問題, 如果你沒把問題找出並解決, 那只是學鴕鳥喔!
程式語言有哪些敘述(Statements; 指述)可用? 用來寫程式的句子稱作 statement, 翻譯作指述(指令的描述)或敘述, 或乾脆說是一句話也可以, 那程式語言(電腦語言)到底有多少句話可以用呢? 其實不多, 如果你是從最前面看到這, 阿那個.. 其實你已經看過全部的敘述(Statements; 指述)。 真的嗎? 當然是真的, 現在就來個總整理。

各家電腦語言大約有百分之八十以上的相似度, 可以使用的敘述共分為以下八類:
 (1)註解(Comment), 就是寫給人看的, 通常有兩種: 
        // 這兩斜線之後直到一列結束都是註解
        /*  這個註解可以橫跨很多列, 直到遇見 星號緊跟著斜線 */
 (2)宣告(Declare)/定義(Define)  變數與常數
        int kk = 38;  // Java 定義一個整數並給初始值 38 
        var kk: int = 38;   // Flash 定義一個整數並給初始值 38  
 (3)運算式(Expression): 數學運算式、關係運算式、邏輯運算式
    可以點這看看有那些運算符號(Operator; 運算子)
 (4)設定值(指定值)敘述(Assignment statement) 用等號 = 把等號右邊的運算式之答案放入等號左邊變數
    嚴格說來這可以不算一類, 因為等號 = 也算是一個運算符號。
 (5)宣告/定義  函數(function; 函式); Flash 的函數前面已經介紹過, 以下是 Java 的函數範例:
    void him(Event e) {    //  void 表示不會回傳任何資料 
       // 做事...
    }
 (6)定義類別(Class)
    就是把資料以及與資料有關的函數包到一個類別(class)內, 以便當作物件來使用, 物件的概念也是仿照真實世界!
    關於物件導向概念請點這連過去看(開新窗)
 (7)複合敘述(Compound statement), 把很多敘述用左大括號與右大括號夾住當作一句, 各句以分號隔開
        { 第一句;  第二句;  愛幾句都可; 最後一句不必寫分號} 
    嚴格講起來這也不算一類 ! 
 (8)控制敘述(Control statement)  讓程式執行順序不是照著寫的順序
    (a)叫用函數(call a function; 調用函數)
    (b)if 敘述(if statement), 又稱選擇敘述(Selection statement)或 Alternative statement
       包括 if .. else 以及多重 if 甚至功能類似的 switch .. case 都算這類選擇敘述。
    (c)迴圈(Loop)或稱重複敘述(Repetition statement):
       就是前面討論過的 for Loop, while Loop, 以及用不太到的 do while 敘述。
    (d)例外處理 (Exception handling)
       就是前面剛討論過的處理世事真的難料之事
真的只有這些嗎? 可是各電腦語言的手冊都好幾百頁ㄟ ! 別懷疑, 真的只有以上這些! 何況前面不是說過, 阿那些作曲家不過就是把 1 2 3 4 5 6 7 兜來兜去, 就可以搞出那麼多曲子, 阿程式設計當然也只要幾句兜來兜去就很厲害了:-) 至於其他一堆有的沒的, 都是程式庫(Library)啦, 自從 Java 語言出現之後, 大家都把程式庫越搞越大, 包括一些預先準備的物件(Objet)以及類別和函數, 也就是通稱的 API (Application Programming Interface)啦。
點這看Flash ActionScript 3.0 程式設計手冊(開新窗) 點這看 Java SE APIs onLine (6.0)(開新窗) 點這看關於 Unity遊戲引擎所用腳本語言API可點這連過去看(開新窗)

 Top


Flash拖拉物件放掉後如何知道放在啥東西上? 

    很多人會以為這是碰撞偵測(collision detection), 其實不是!
這只是看看你停止拖拉(stopDrag)之後, 到底把物件放在哪個"顯示物件容器"上,               
所以正確的做法是檢查你的 dropTarget, 例如:
      if( haha_mc.dropTarget.parent.name == "backware") {
           // do something
      } 
  請注意, 不要寫成
      if( haha_mc.dropTarget.name == "backware")  ... 
  這樣永遠不會查得到! 原因是它有"容器"的概念!

  甚至, 如果 target 物件很複雜, 你可能要寫成以下這樣才查得到:
      if( haha_mc.dropTarget.parent.parent.name == "backware") {
           // do something
      } 

點這看 Adobe AS3  flash.display.DisplayObject 顯示物件類別的 參考手冊


點這看 Adobe AS3  flash.display.DisplayObjectContainer 顯示物件容器類別的 參考手冊


 Top


Flash碰撞偵測 hitTestObject(物件) 與 hitTestPointer(X座標, Y座標)
    在 AS2 時代的 hitTest( ) 函數到了 AS3 被拆開為兩個函數:
hitTestObject(物件); 與 hitTestPointer(X座標, Y座標);

   hitTestObject: 判斷影片片段和指定物件的的範圍框是否有重疊或相交。
      因為其實物件都是方形範圍, 所以有時看起來沒碰撞也會被偵測為已經撞到! 範例:
         if( my_mc.hitTestObject( your_mc ) {
               // 撞到了, do something
         }

   hitTestPoint: 顧名思義, 只偵測一個點是否在物件的形狀範圍內;
      這時你可以給第三個參數為 true 以便真的只偵測有像素部份, 例如:
         if( my_mc.hitTestPointer( mouseX, mouseY, true) {
              // do something
         } 
   但是這只對於向量圖有效, 如果是點陣圖(bitmap; .bmp檔案)則沒有用, 仍是偵測方型範圍。

更多關於碰撞偵測的範例與進階討論, 請點以下網址連過去看: 
http://sierakowski.eu/list-of-tips/39-collision-detection-methods-hittest-and-hittestobject-alternatives.html



 Top


善用程式碼片段 (Code Snippets)
    Flash 已經把許多常用的"動作"寫成程式碼片段(Code snippets),
例如按一下前往網頁, 按一下跳到某影格, 甚至倒數計時範例或水平動畫, 垂直動畫等等,
都可以彈指之間就生出來! 
請點這裡看相關說明。

    甚至, 我們還可以自己蒐集定義自己常用的ActionScript3.0 程式碼片段,
詳細的說明請點這連過去看"如何自己定義程式碼片段"。(開新窗)
可以把這個我寫的程式碼片段 godSnippets.xml 抓回你電腦(按滑鼠右鍵另存新檔), 然後從你的Flash動作面板匯入它。


  

善用程式碼提示 (Code Hint)
如何善用  程式碼提示(Code Hint)? 
    很簡單!
    當然你還是得先打入前面幾個字母(這時可不必管大小寫)!
最簡單就是先打入 goto  接著去點按 有個左括號連著說明圖示的 "顯示程式碼提示" 
然後會看到所有 goto 開頭可以用的語句, 
        其實也只有 gotoAndStop(gotoAndPlay( 兩句子可選啦 !
   在希望選的項目上滑鼠連敲兩下即可 ! 


看到了吧: 原來寫程式很簡單:-) 每次只要敲幾個似曾相似的英文字 :-)) 以剛剛舉例的練習來說, 這次只要會敲 goto 然後去點按那個顯示程式碼 阿就可以選到你要的命令! 至於該命令的詳細語法則輕輕點一下該命令的英文字, 然後立刻敲 F1 就可以看到說明 !
再看看以下例子... 以下則是自動產生的喔! 利用了Code Snippets(程式碼片段), 以及"顯示程式碼提示"功能! (注意以下的程式碼是自動產生在場景一的 Actions 圖層的最後一個影格) 當然我有打入一列程式碼: 先打了 goto 然後立刻去點那個"顯示程式碼提示", 接著點兩下選想要的!

gotoAndStop( 參數 )gotoAndPlay( 參數 ); 這兩個函數很常用!
阿如果不知道 gotoAndStop( ) 的括號內的參數意義, 
    可以先在 gotoAndStop 這字輕點一下, 然後立刻敲 F1 功能鍵,
    就會把 HELP 視窗叫出來且顯現 gotoAndStop( ) 這函數所需之參數以及其意義!
會寫 Flash 程式 (Action Script 3)的薪水絕對不止 22K 喔! 
Flash 高手(會畫畫又會一些 ActionScript 3)大學畢業起薪至少五萬元!
大家加油囉!

如果你已經看了三遍但仍有些地方看不太懂, 那就先不要管它了 ! 大概知道個概念即可, 有些以後看到其他相關的範例或說明自然就會懂了 :-) 原則上, 儘量用真實世界的角度去思考, 因為物件導向(Object Oriented)概念就是參考真實世界的現象設計的。

 Top
看完這篇程式設計概念的文章之後, 你最需要的應該是稍微了解一下物件導向(Object Oriented)的概念! 想知道更多關於物件導向程式設計(Object Oriented Programming)概念的請按這連過去看。 (會蓋掉此篇, 但你可以點按視窗左上角的回到這篇)