Tuesday, May 3, 2011

[翻譯文]如何使用文檔類別

Here's a article about Document Class translated into Traditional Chinese.

很多使用flash不久的人,大概還不知道什麼是文檔類別(Document Class),

所以這裡翻譯一篇文檔類別的文章,希望對想認識文檔類別的人有幫助。

以下是翻譯的文章內容:

為什麼使用類別(class)檔案?

我必須承認這一點 ─> 有時,編寫程式碼在時間軸上是可運行的。這是一個快速的方法來測試效果也是最簡單的方式同步操作的特定的影格動畫。

但是,對於相對於動畫需要更多的程式碼的專案,存在著嚴重的缺點。你所有的ActionScript是被困在FLA文件檔,你不能分割不同的程式碼給開發人員,如果你想重覆使用某些程式碼時,你必須複製和貼上程式碼,並且你不得不使用Flash的動作面板。

使用類別檔案讓你的程式碼更自由。他真的不會比在時間軸編寫程式碼來的困難;它只是涉及到多一點的設定。我將引導您藉由使用文檔類別創建Flash專案,然後拆解分析類別文件的細節。


第一步:建立一個FLA檔案

我相信你已經知道如何去建立一個fla檔了。打開Flash並且點選 檔案> 新增 ...Flash 檔案 (ActionScript 3.0)。儲存它在你想放的地方。我將檔名存為Example.fla,但如果你存成你想要的檔名也不是什麼問題。


第二步:建立一個ActionScript檔案

點選 檔案> 新增 ...ActionScript 檔案 (ActionScript 3.0)。儲存檔名成Main.as與你的fla放在同一個資料夾中。這個ActionScript檔案是要給FLA檔案撰寫程式碼的地方,但我們如何讓Flash知道如何找到它呢?


第三步:連結FLA檔案到ActionScript檔案

您可能有幾十個AS檔案與FLA檔案在同一資料夾,Flash不想去猜測該使用哪一個。我們得告訴它。切換到選擇工具(快捷鍵:V)時,然後確定你沒有選擇物件(按Ctrl+Shift+A)。打開屬性面板(視窗>屬性)。

如果你使用的是Flash CS3,它會看起來像這樣:


圖片來源:active.tutsplus.com

在屬性面板中標示為"文檔類別(Document class)" - 這邊必須填上你的ActionScript檔案名稱,但不用填上".as"的附檔名..

如果您使用的是Flash CS4中,它會看起來像這樣:


圖片來源:active.tutsplus.com

在這種情況下,您需要在屬性面板中標有"類(Class)"填上你的ActionScript檔案名稱。出於某種原因,Adobe公司在CS4放棄了"Document(文檔)"的字。


第四步:(可選做的)重新組織你的資料夾結構

你不一定要讓所有的文件在同一資料夾中。看看這個小提示影片,如果你想知道如何移動檔案。


第五步:撰寫你的文檔類別

打開你的Main.as文件並貼上以下代碼:
package{
    import flash.display.MovieClip;
    public class Main extends MovieClip
    {
        public function Main()
        {

        }
    }
}

這是一個基本的空文檔類別。這是我們可以寫出最小量的程式碼,然後可以實際運行。讓我分解說明一下:


圖片來源:active.tutsplus.com

"package"的關鍵字告訴Flash所有程式碼都在此大括弧之中為一個群組。


圖片來源:active.tutsplus.com

編寫Main類別檔(Class)也可以將程式碼群組在一起,但以不同的方式。類別(Class)包含函數和變數;packages中則包含類別和import語句。

注意:你必須給你的類別(class)與AS檔案相同的名稱:Main。

什麼是關鍵字public?嗯,這只是意味著其他類別可以使用這個類別。


圖片來源:active.tutsplus.com

這個Main的類別(Class)將會控制我的FLA檔案。在預設下,我們的FLA是一個影片片段(有時間軸)

我們希望Main能夠做到影片元件可以做的一切事情,以此基礎我們再加上更多的程式碼。換句話說,我們要繼承一個一般功能的MovieClip。

(有時,我們可能不需要做任何動畫在舞台上的主時間軸,在這種情況下,我們並不需要繼承的MovieClip,我們可以只繼承Sprite。MovieClip的本身繼承自Sprite,但增加了額外的動畫功能,像nextFrame()函數。因此,如果你不知道你是否應該繼承MovieClip或Sprite,可以使用的MovieClip - 它較安全的!)

*Hanpo註解:但是繼承MovieClip相對於Sprite檔案會較大。


圖片來源:active.tutsplus.com

影片元件(MovieClip)本身就是一個類別。

Flash不會自動跟踪所有的類別文件被儲存在哪;為了讓我們的繼承MovieClip的程式碼運作,我們需要告訴Flash在哪裡可以找到MovieClip類別。這就像是導引線一樣。

導入語句總是放在package內和類別(class)外,並且在頂部。


圖片來源:active.tutsplus.com

每個類別包含一個與類別相同名稱的函數。它被稱為建構函數。

當這種類別的物件被創造時,所以在這個函數的程式碼將會運作 – 在我們的情況下,當SWF被讀取時,這些大括號之間的程式碼將會運行。

不要擔心,如果你覺得你還是不太懂這一切。一旦你確實地開始使用類別且編寫你自己的類別,一切將會迅速地理解。


第六步:讓它做些事情

正如我在第5步驟中說的,當您的SWF被讀取時,建構函數包含第一個被執行的程式碼。因此,讓我們把一些東西放在裡面,以確保一切都能正常運作:
package
{
    import flash.display.MovieClip;
    public class Main extends MovieClip
    {
        public function Main()
        {
            trace( "Yep, it's working" );
        }
    }
}

第八行是唯一新增的地方。用通常的方式測試你的SWF(控制 > 測試影片)。如果一切正常,你應該看到"Yep, it’s working"在輸出面板。如果沒有 ...

  • 你有沒有對Main.as所做的更改儲存?
  • 你的FLA的文檔類別(Document Class)設定為Main了嗎?
  • 你確實的測試過Example.fla了嗎?

如果沒有上述問題的沒法幫助你檢查出錯誤,請留言討論。


第七步:嘗試做些更複雜的事情

嘗試更換您的Main.as程式碼如下:
package
{
    import flash.display.MovieClip;
    public class Main extends MovieClip
    {
        public function Main()
        {
            var greeting:String = "Hello";
            trace( greeting );
        }
    }
}

簡單吧?我們剛剛建立的一個新的String變數在建構函數內。現在讓我們添加一個新的功能:
package
{
    import flash.display.MovieClip;
    public class Main extends MovieClip
    {
        public function Main()
        {
            var greeting:String = "Hello";
            changeGreetingToFrench();
            trace( greeting );
        }
        public function changeGreetingToFrench():void
        {
            greeting = "Bonjour";
        }
    }
}

有一些事情要注意這裡。

首先,新函數放在類別裡面並且在建構函數之後 - 按照慣例,建構函數是類別中的第一個函數。

其次,新函數是public的,當編寫程式碼在類別裡時(而不是在時間軸)將其設為"public"(或"private"或"protected",但我會留下那些東西寫在另一篇文章)在開始的幾行定義的函數。這只是一種方式,讓其他類別知道他們是否可以訪問它。

*Hanpo註解:設為public不一定是最好的,應視需要設定之。

第三,新的函數的定義結尾:void。這只是意味著它沒有返回值。建構函數不需要:void,因為他們不能返回一個值。

如果您測試這個影片,你會得到一個錯誤信息:

Main.as, Line 15: 1120: Access of undefined property greeting.
(意思是存取未定義的屬性 greeting.)

當您創建一個變數在函數內部時,它不能其他函數被訪問。如果你想創造在同一個類別中每一個函數都能夠訪問的變數,你需要先宣告變數在類別內且在所有函數之外:
package
{
    import flash.display.MovieClip;
    public class Main extends MovieClip
    {
        public var greeting:String = "Hello";

        public function Main()
        {
            changeGreetingToFrench();
            trace( greeting );
        }

        public function changeGreetingToFrench():void
        {
            greeting = "Bonjour";
        }
    }
}

正如函數,如果你宣告一個變數在函數外,您需要宣告它是"public"(或"private" 或"protected")。不像函數,變數應該被定義在建構函數上。現在測試你的影片,你應該最終得到一個不錯的法語問候。真是令人滿意呀!


結語

所以,這不完全是一個令人興奮的成果,但希望你現在覺得能夠按照教程不將程式碼寫在時間軸。

我真的希望確保每個人都知道如何使用文檔類別,所以如果有任何不清楚,請留言。一旦我們弄清楚了疑惑之處,我將會編輯快速提示說明,以方便下一個人理解。謝謝:)


*Hanpo:以上為翻譯內容,希望這篇文章對需要的人有幫助,如有翻譯錯誤也歡迎提出,感謝!



原文來源:How to Use a Document Class in Flash
中文翻譯:Hanpo

.

No comments:

Post a Comment