[AS]as3でのスクリプトの実行の順番をmemo
swfを開いたときに実行される順番がこんがらがることが多いので調べた。
まずはドキュメントクラスのコンストラクタとメインのタイムラインのフレームアクションの比較
- 1.ドキュメントクラスのコンストラクタ。
- 2.メインタイムラインのフレームアクション
これは想像通り。
注意が必要なのはリンケージしたMCをnewするとき、(ドキュメントクラスの)コンストラクタでnewするか、(メインのタイムラインの)フレームアクションでnewするかというとき。
※前提として、メインのタイムラインにはMc(Mc0_tl)が配置してあり、Mc0_tlには、さらにMc(Mc1_tl)が入れ子で配置してることとする。
まず、ドキュメントクラスのコンストラクタでnewする場合
- 1.DocumentClass コンストラクタ開始
- 2.DocumentClass ムービークリップを動的に生成(new MyMc0_as())
- 3.▲MyMc0_as コンストラクタ開始
- 4.▲MyMc0_as コンストラクタ終了
- 5.DocumentClass ムービークリップを動的に生成終了
- 6.DocumentClass コンストラクタ終了
- 7.★MyMc0_as フレームアクション開始
- 8.★MyMc0_as フレームアクション終了
- 9.mainTimeLine フレームアクション開始
- 10.mainTimeLine フレームアクション終了
- 11.MainTimeLineに配置した Mc0_tl フレームアクション開始
- 12.MainTimeLineに配置した Mc0_tl フレームアクション終了
- 13.Mc0_tlに配置した Mc1_tl フレームアクション開始
- 14.Mc0_tlに配置した Mc1_tl フレームアクション終了
動的にnewしたMyMc0_asのフレームアクションが開始されるのは、ドキュメントクラスのコンストラクタ終了直後。
(メインタイムラインのフレームアクションの前)
次にメインタイムラインのフレームアクションでnewする場合(1フレーム目に記載)
- 1.mainTimeLine フレームアクション開始
- 2.mainTimeLine ムービークリップを動的に生成(new MyMc0_as)
- 3.▲MyMc0_as コンストラクタ開始
- 4.▲MyMc0_as コンストラクタ終了
- 5.mainTimeLine ムービークリップを動的に生成終了(new MyMc0_as)
- 6.mainTimeLine フレームアクション終了
- 7.MainTimeLineに配置した Mc0_tl フレームアクション開始
- 8.MainTimeLineに配置した Mc0_tl フレームアクション終了
- 9.Mc0_tlに配置した Mc1_tl フレームアクション開始
- 10.Mc0_tlに配置した Mc1_tl フレームアクション終了
- 11.★MyMc0_as フレームアクション開始
- 12.★MyMc0_as フレームアクション終了
動的にnewしたMyMc0_asのフレームアクションが開始されるのは、ステージに配置してあるMc0_tlのフレームアクションが全て完了してから。
ここで気をつけるのは、MyMc0_asのフレームアクションにたとえば、
//MyMc0_asのフレームアクション開始 var myProp:Number; myProp = Math.random(); MyMc0_asのフレームアクション終了
と書いて、
メインのタイムラインのフレームアクションで、以下のようにすると
var mc:MovieClip = new MyMc0_as(); trace(mc.myProp);//出力:NaN(Math.random()の代入は実行されていない)
期待通りの結果が得られない。
乱数が代入された結果を得るには、メインタイムラインの2フレーム目以降で、mc.myPropを参照すればOK。
一応検証したファイルをアップします。
1004231414_asflowtest.zip
読んでもさっぱり意味がわからない人はどーぞ。。。
Tweet