- 外部swfのロードイベントと安全な初期化
実際コンテンツ作成で検証していないので、
ベストプラクティスかどうかわからないけど、メモ。

事前条件 ------------------------------------------------------------
main.swfがtest.swfをロードします。
またtest.swfは、rootの一フレーム目と最終フレームに
数百バイトのデータを持ち、
一フレーム目には初期化コードが記述れています。
--------------------------------------------------------------------------
var loader:Loader=new Loader();
loader.load(new URLRequest("test.swf"));
ベストプラクティスかどうかわからないけど、メモ。

事前条件 ------------------------------------------------------------
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を起動するのが

安全では無いでしょうか?
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を起動するのが

安全では無いでしょうか?
Trackback : 0 : 外部swfのロードイベントと安全な初期化
http://www.onmyownlife.com/mt/mt-tb.cgi/4
Comment