- 外部swfのロードイベントと安全な初期化

実際コンテンツ作成で検証していないので、
ベストプラクティスかどうかわからないけど、メモ。

fuuya.jpg













事前条件  ------------------------------------------------------------

main.swfがtest.swfをロードします。
またtest.swfは、rootの一フレーム目と最終フレームに
数百バイトのデータを持ち、
一フレーム目には初期化コードが記述れています。

--------------------------------------------------------------------------

var loader:Loader=new Loader();
loader.load(new URLRequest("test.swf"));



■IO_ERRORの場合

IOErrorEvent.IO_ERRORが発生して終わりです。



■正常動作の場合

●一番最初に
ロード開始を知らせるEvent.OPENが発生します。
この時loader.contentはnullです。
これは、ロード開始イベントなので、
test.swfが外部からアクセスできる状態ではないと
いう事を考えれば、納得できると思います。
もちろん、loader.content.loaderInfoもnullです。
しかし、loader.contentLoaderInfoはnullではありません。
この時点で取得できる情報のみ値がセットされています。
これもmain.swfで定義されたloader自身のプロパティであることを
考えれば、納得できます。
たとえば、loader.contentLoaderInfo.loaderURLは,*****/main.swfです。
bytesTotal,urlなどは0,nullなどです。
bytesTotalが0なのは理解できますが、
urlがnullなのは少し疑問です。
しかしurlはmain.swfが知っている事なので支障はないです。


●二番目
ProgressEvent.PROGRESSが発生します。
test.swfの一フレーム目が完全にロードされるまで、
ProgressEvent.PROGRESSが続きます。


●三番目
test.swfの一フレーム目が完全にロードされると、
test.swfのrootの一フレーム目に記述されたasがすべてまず実行されます。
複雑な階層構造のDisplayObjectたちがいろいろな処理を行っていても、
すべて実行されます。

●四番目
Event.INITが発生します。
この時点でloader.contentはロードしたswfのrootを参照します。
つまりloader.content.loaderInfo==loader.contentLoaderInfoはtrueとなります。


●五番目
引き続きProgressEvent.PROGRESSが続きます。


●六番目
ProgressEvent.が返すbytesLoadedとbytesTotalが等しくなり、ProgressEvent.PROGRESSが終了します。


●最後に
Event.COMPLETEが発生します。


注意すべきことは、
Event.INITと外部swfの一フレーム目の実行です。

外部swfの一フレーム目で
複雑な処理、
コードを把握していないクラスのインスタンス化、
コンポーネントを配置、実行するのは、
避けたほうがいいと気がします。


外部swfの一フレーム目は空もしくは、
main.swfから引き継ぐparameterだけを定義
loaderInfo.parametarsに設定したほうがきれいかもしれない。

var mainRoot:*;
var container:*
var myParent:*;
var myID:Number;

Event.INIT時
loader.content.stop();
loader.content.mainRoot=this.root;
loader.content.myParent=this;
loader.myID=335435224;

Eevent.COMPLETE時
loader.content.play();


この順番で、外部swfを起動するのが

fuuya.jpg


















安全では無いでしょうか?

Comment