2012-09-13

Flash的影片元件(MovieClip)到底做了什麼?

用了一段時間的flash,發現了一些問題。影片元件(MovieClip)的功能強大、方便,是flash的最大特色,但同時也是flash最大的敗筆、效能低落的元兇。當你製做了個影片元件,它背後到底做了些什麼事?

以下所有內容皆為本人臆測,並沒有實際証實,若內容有誤,請留言告知。若因此篇文章導致您的損失,恕在下無法負責。

1.我放了一個元件在場景上,並且把它命名為XXX。

暫定命名此場景為影片元件S,放入的元件命名為A

當S開始初始化時,會自動將S新增一個屬性A,
並且會將資料型別設定為第一影格此元件的類別。

因此,若在不同影格放不同類別的元件使用同一屬性名稱,可能會出錯(有的版本會,有的不會),可以事先宣告此屬性的資料類型為基底類別。

 // 應該不是addChild這個方法 但是指這意思
 // 可能是 flash.display::Sprite/constructChildren,可以使用 throw new Error 來測試。
S.addChild(A元件) ;
S.A = A元件


2.我的影片元件現在是在第2影格,那我第1影格的元件呢?

 //邏輯部分大概像這樣 (不考慮本來無A元件之情況)

if(此影格沒有A元件){
    S.removeChild(A元件);
    S.A=null;
}else if(此影格A元件與前影格A元件的類別不同){
    S.removeChild(A元件);
    此影格的A元件 = new 此影格的A元件類別
    S.addChild(此影格的A元件);
    S.A = 此影格的A元件
}else {

    if(A元件的屬性是否有過被AS碼操控過){
         // 比如說座標有被改變
         A元件屬性保留不變動
    }else{
        // 比如說同元件不同時間軸時座標不同
        將A元件屬性設為此影格時的A元件屬性
    }
    
}

3.為什麼將XXX元件放在場景上時沒問題,改用addChild(new XXX)的方式會跳出stage是null的錯誤訊息?

 可能1.特殊模式
我認為當物件使用放在場景上的方式進入場景時,會進入一個特殊模式,此時此DisplayObject的stage屬性會自動指向舞台,一直到此類物件進入舞台後,才會關閉此特殊模式,接著才是執行你寫的actionscript。

 可能2.繼承
或是此類物件會繼承你原本XXX再override stage屬性的處理方式。

 可能3.特級權限
或是 constructChildren似乎是允許在建構式之前執行。

如果有需要使用到stage屬性,請盡量使用以下寫法

       public function constructor() {
            // constructor code
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
       }

        private function init(e:Event = null):void
        {
            if (e) e.currentTarget.removeEventListener(e.type, arguments.callee);
            //接下來可以使用stage了
        }

4.我在影格裡也可以寫程式碼,這跟寫在類別AS檔有什麼差別?

MovieClip有一屬性為addFrameScript

addFrameScript(影格編號 -1,function(){你寫在此編號影格裡的東西})

圖層在上方會優先執行


因為需要addFrameScript所以Sprite不能在影格內寫

5.在單時間軸影格內寫程式碼與多時間軸影格內寫的效果?

在多時間軸影格內寫 == 在多影格時間軸的最前面一個影格的單時間軸內寫

請不要在影格內寫好嗎......


未完成...

待續....

沒有留言:

張貼留言