2010年5月10日 星期一

AS3 撰寫外部as檔 從零開始 之 4 as檔案的結構 function (方法)

終於講到關鍵的部分了,實際上這支程式主要的作用只有 stop()這個指令而已,前面幾節主要都是說明程式架構的部分

package 
{
        import flash.display.MovieClip;
        public class Main extends MovieClip   
       {
             public function Main()
             {                    
                      stop();
             }
       }
}


以下針對藍色程式的部分說明

public function Main()
 {                    
         stop();
 }


public 上一節講過了,是公開的意思,往後你可以在別的Class(類別)裡面使用它,另外還有private,這是私有的意思,代表只有這個Class可以使用它的意思,關於這邊,或許聽的很模糊,現在不了解沒關係,往後有遇到,會再用實例說明一次
function 函式(或是方法), function Main( )的意思是,這是一個函式(方法),它的名子叫做Main,然後面的()括號一定要要加,這個括號是有意義的,之後再詳細說明
stop(); 這個應該就不用再說了,這是這個影片主要作的事,一開始把影片停住....

很明顯的,function Main(){ ..... }裡面填的就是你平常寫在影格中的事...
一個Class可以有很多個function,請看看以下的程式片段


package 
{
        import flash.display.MovieClip;
        public class Work extends MovieClip   
       {
             public function Work()
             {                    
                      stop();
             }
             public function Main()
             {                    
                     play();
             }
       }
}



這是一個Class它的名字叫做Work,而且它是一個MovieClip(extends MovieClip),是否注意到了,這個叫做Work的Class,它有兩個function,一個叫做Work(),另一個叫做Main(),這兩個function各作不同的事,一個是stop();,另一個是play();
好了,現在問題來了,這兩個function,到底哪一個會先執行?
其實一個Class,如果裡面有一個function的名子,跟Class的名子一樣的話(包含大小寫也要一樣喔!),這個function就叫作建構式,你可以想成這個程式的起始點,意味著程式是由這邊開始跑
所以這個Class會先執行Work()這個function,有就是stop()這句程式
Main()則是有呼叫它,才會執行,例如我在 stop(); 下一行加了 Main();


package 
{
        import flash.display.MovieClip;
        public class Work extends MovieClip   
       {
             public function Work()
             {                    
                      stop();
                      Main();             }
             public function Main()
             {                    
                     play();
             }
       }
}


當程式執行完了stop();這行後,就會去執行Main();這個Main()這個函式,也就是程式會跳到Main()裡面去執行play()這個指令
如果play()執行完了,後面沒有再呼叫其他的function,那程式就到使結束了...

好了,學到這裡,你應該可以慢慢的開始嘗試開始寫一些外部as檔案了....
但是不久後,你會發現一個問題,是不是寫外部as檔案都只能寫在影格第一格?,那如果我拉了動畫,需要在第十格加個stop()指令,讓動畫停止,要怎麼辦呢?
當然你也可以直接在你的第10影格上加個stop()指令,外部as檔案跟影格上面的as程式碼是可以同時並存的,不過這樣似乎是有點遜掉了,既然要寫外部as,當然全部程式都寫在寫外部as檔案裡面
在此告訴各位一個未公開的函式指令

addFrameScript(影格,函式)

這個指令可以讓你在某個影格內置入某個function的程式碼,我們直接看以下例子
如果我需要在第10影格上加個stop(),我的程式必須要這樣寫


package 
{
        import flash.display.MovieClip;
        public class FN extends MovieClip   
       {
             public function FN()
             {                    
                      addFrameScript(9,ACC)
             }
             public function ACC()
             {                    
                    stop();
             }
       }
}



這個Class叫做FN,一開始他會先執行function FN()裡面的程式碼,addFrameScript(9,ACC)
在影格9裡面加上ACC函式的內容,就是stop();
以上有個問題點,就是我們不是要在第10影格才加的嗎?為何要影格要用9呢?
其實如果以程式的觀點來看,數量一開始通常都不是1,而是0,所以如果第一個影格上面要加程式,
就會變成addFrameScript(0,函式);
換句話說,如果你要在第10影格上加ACC的函式內容,就會變成
addFrameScript(9,ACC);

以上應該不難理解

最後再跟各位提一點要注意的問題,外部as檔案跟影格上面的as程式碼是可以同時並存的,但是要是我同時寫了外部的as檔案,跟影格第1格的as程式,那哪一個部分的的程式會先被執行?
先被執行的程式是外部的as檔案,因為外部as檔案是元件建構時就會被執行的(影格0),而影格上的as程式碼則是影格1才會被執行的,所以外部as檔案絕對優先于影格上的as檔案

6 則留言:

Richard 提到...
作者已經移除這則留言。
Richard 提到...

hi
我是一個as的初學者,你網站上的內容對我很有幫助,看完你的教學後有一個問題想請教,你有提到一個Class,如果裡面有一個function的名子,跟Class的名子一樣的話,程式會由這個function開始跑,其他的則是有呼叫它,才會執行。

請問這是否意味著程式只跑跟class同名的function中的內容?? 如果今天我沒有在work 中加入Main(),那麼Main()是不是就不會執行??

因為我聽其他人說,程式是從頭到尾逐條執行的。

Unknown 提到...

是的,您說的沒錯,一開始只會跑與Class同名的function
凡是程式,總是有個進入點(類似程式起跑點...),as3的程式進入點則是與這個Class同樣名稱的function (有些與語言的進入點確實是Main(),如C 不過as3並不是)

至於您說的程式是從頭到尾逐條執行的,也不算錯,不過僅限於一個function內他會從頭跑到尾,function要執行一定是被呼叫才會執行。(不過中途遇到return會跳離..)

當你做了一個動作 new MyClass();
其實就是建立一個 MyClass的實體,還會呼叫這個MyClass的進入點MyClass function() 這個函式(一般說建構式)

幫然如果你的Class裡面並沒有MyClass() 這個function,而改用Main()也無所謂,不過as3並不會自動幫你呼叫Main()

變成你得這樣做才行..
var _class:MyCalss = new myClass(); //建構
_class.Main(); //呼叫執行


Unknown 提到...
作者已經移除這則留言。
Richard 提到...

hi
感謝你的快速回復,也就是說如果我今天在一個class中寫了很多function,但實際執行的只有與class同名的那個function摟?其他的function則會跳過不執行?是這樣嗎?

目前比較不了解的是,我建了一個main.as檔,在這個class中我又列了好幾個function。當中其中一個function 出了錯誤,但這個function不是不是main function,也不沒有用在main function中,是等著被外部呼叫。

當我執行這個程式時卻無法執行,出現錯誤訊息,如果程式只有執行main function的話(main function中沒有錯誤),那程式怎麼會執行錯誤??

Unknown 提到...

一般來說程是錯誤有兩種一種叫做邏輯錯誤(類自己己想錯了...)
另一種叫做語法錯誤,比方說 字打錯 宣告錯誤 屬性有誤
找不到元件 之類的...
這種錯誤在編譯成swf時,flash會幫你重頭到尾檢查一次 (不是執行程是噢 只是檢查而已哪裡怪怪的..)
如果有被檢查出來,編譯就過不了...
其實這種錯誤都還好,因為flash會跟你說錯在哪(甚至為什麼錯)