在Flash IDE的開發環境下,我們不僅可以透過Document Class的方式來寫AS3程式,另外也可以透過時間軸(Timeline)的方式來達成,甚至還可以混合這兩種方式,那究竟寫在Document Class和Timeline兩者的寫法有何差異,底下各別來探討:
Document Class - Hello
Hello.as
package { import flash.display.*; public class Hello extends MovieClip { public function Hello() { trace("Hello"); } } }
直接在Document Class中設為「Hello」並輸出swf檔案。
Decompiling:
package { import flash.display.*; public class Hello extends MovieClip { public function Hello() { trace("Hello"); return; } } }
從結果上來看,程式的結構上並沒有太大的變化,接下來看時間軸的作法。
Timeline - Hello
直接在時間軸Frame[0]寫下:
trace("Hello");
並直接發佈成swf檔案。
Decompiling:
package hello_fla { import flash.display.*; dynamic public class MainTimeline extends MovieClip { public function MainTimeline() { addFrameScript(0, this.frame1); return; } function frame1() { trace("Hello"); return; } } }
經由時間軸的寫法可以發現,只有一行「trace("Hello");」程式完全被重新包裝,Flash編譯器自動產生了一個Dynamic Class「MainTimeline」來達成,而且原先的「trace("Hello");」程式並不是被寫在MainTimeline的Constructor之中,而是透過「addFrameScript」函式來明確地指定「Frame 0」位置來達成,那如果混合Document Class和Timeline的作法又是如何呢?
Document Class & Timeline - Hello
將上述「Hello.as」直接拿來使用,並在時間軸Frame[0]的位置加上「trace("Hello2");」來測試。
Decompiling:
package { import flash.display.*; public class Hello extends MovieClip { public function Hello() { addFrameScript(0, this.frame1); trace("Hello"); return; } function frame1() { trace("Hello2"); return; } } }
透過Document Class和Timeline混合的作法可以發現,Flash編譯器會將Timeline上的程式加到Document Class的Constructor之中,所以如果從Runtime的「執行順序」上來看(非程式順序),該程式即會印出:
Hello Hello2