以下所有內容皆為本人臆測,並沒有實際証實,若內容有誤,請留言告知。若因此篇文章導致您的損失,恕在下無法負責。
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有一屬性為addFrameScriptaddFrameScript(影格編號 -1,function(){你寫在此編號影格裡的東西})
圖層在上方會優先執行
因為需要addFrameScript所以Sprite不能在影格內寫
5.在單時間軸影格內寫程式碼與多時間軸影格內寫的效果?
在多時間軸影格內寫 == 在多影格時間軸的最前面一個影格的單時間軸內寫請不要在影格內寫好嗎......
未完成...
待續....
沒有留言:
張貼留言