Macromedia Flash非公式テクニカルノート TLFテキストが配置されたメインタイムラインの初期化
[TLFテキスト]で使われるActionScriptライブラリは、デフォルトではランタイム共有ライブラリとして読込まれます[*1]。そのため、[TLFテキスト]を用いたSWFファイル本体は容量が小さく抑えられるものの、ライブラリのロードに少し時間がかかったり、初期化される間にメインタイムラインが密かに表示リスト間をさまよったりします[*2]。しかも、そのふるまいが、Flash Player 10や10.1(Flash Professional CS5)と10.2(同CS5.5)とでは異なることに、注意しなければなりません。
01 メインタイムラインはどこにいるのか
ところが、タイムラインの(表示リストの)階層のどこかに[TLFテキスト]があると、ステージとメインタイムラインとのつながりが変わります。たとえば、Flash Professional CS5で、新たなムービーのメインタイムラインに[TLFテキスト]をひとつ置いてみます(図002)。 図002■メインタイムラインに[TLFテキスト]を置くそして、メインタイムラインにはつぎのフレームアクションを書きます(図003)。メインタイムラインからwhileループによりDisplayObject.parentプロパティで親インスタンスを順に遡って、配列エレメントに加えたうえで[出力]します。
図003■メインタイムラインのフレームアクションで親インスタンスを遡って確かめる [出力]された配列エレメントは、以下のようにメインタイムライン([object MainTimeline])から始まり、表示リストの階層の頂点であるStageオブジェクト([object Stage])で終わっています。注目したいのは、ふたつの間にLoaderオブジェクト([object Loader])とプリローダインスタンス([object MainTimeline__Preloader__])が加わっていることです(図004)。 [object MainTimeline],[object Loader],[object MainTimeline__Preloader__],[object Stage]図004■Flash CS5で[TLFテキスト]をもったメインタイムラインの場所
ところが、同じムービーをFlash CS5.5でつくり、その最新バージョンであるFlash Player 10.2で[ムービープレビュー]すると、[出力]はつぎのようになります。これは、前掲図001の普通の場合と同じ状態を示します。 [object MainTimeline],[object Stage] もっとも、もう少し詳しく調べると、Flash Player 10.2ではメインタイムラインがStageオブジェクトの第二子になっています(後述03)。そして、いずれのバージョンでもこれらのつながりは一時的で、最後には普通の状態に落着きます。そこで、[TLFテキスト]を含んだメインタイムラインとStageオブジェクトのつながりがどう移り変わるか、ふたつのバージョンそれぞれについてご説明します。 02 Flash Player 10および10.1における[TLFテキスト]をもったメインタイムラインの動き
[1]まず、メインタイムラインのインスタンスがつくられるとき、いずれの表示リストにも属しません。つまり、親のないインスタンスとして生まれます。 [2]つぎに、前項で見たように、メインタイムラインはLoaderオブジェクトの子になり、プリローダのインスタンスを介して、Stageオブジェクトの表示リストに加わります。 [3]その後、Loaderオブジェクトからメインタイムラインは引取られて、Stageオブジェクトの実子になります。 [4]最後に、プリローダが消し去られると、ようやくStageオブジェクトとタイムラインは親ひとり子ひとりの普通の関係に落着くのです。この状態に至れば、[TLFテキスト]があることをとくに気にかける必要はありません。 スクリプトを書くときに気をつけなければならない例を、[1]から[3]について考えてみます。 Flashムービー(FLA)ファイルにドキュメントクラスを設定した場合(図006)、そのコンストラクタメソッドは[1]のときに呼出されます。このとき、プロパティDisplayObject.parentとDisplayObject.stageの値はnullです。したがって、コンストラクタメソッドからStageオブジェクトのプロパティ、たとえばステージの幅や高さ(Stage.width/Stage.heightプロパティ)を調べようとすれば、ランタイムエラー#1009が告げられます[*3]。 TypeError: Error #1009: nullのオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 図006■ムービーにドキュメントクラスを設定する メインタイムラインの第1フレームアクションは、前項で確かめたとおり[2]のときに実行されます。このとき、親インスタンス(DisplayObject.parentプロパティ)はLoaderオブジェクト、Stageオブジェクトのインデックス0の子(stage.getChildAt(0))はプリローダになります。普通は、前者がStageオブジェクト、後者はメインタイムラインが参照されるのと異なります。もっとも、このような参照の仕方はあまり多く用いられないでしょう。 [2]で起こる問題の例として、もうひとつ「TLFテキストのある外部SWFを読込むとその中のオブジェクトにアクセスできない」場合があります。詳しくは、リンクしたノートをお読みください。 [3]はStageオブジェクトの子にプリローダが残っているだけですので、一見問題なさそうです。しかし、[2]から[3]に移るときメインタイムライン上のインスタンスにDisplayObject.removedFromStageとDisplayObject.addedToStageイベントが生じることに注意しなければなりません。 たとえば、メインタイムラインの第1フレームに置いたMovieClipシンボルにDisplayObject.removedFromStageイベント(定数Event.REMOVED_FROM_STAGE)のリスナー関数を定め、インスタンスがステージから削除されたときの後かたづけをする場合が考えられます(図007)[*4]。つぎのようなテスト用のフレームアクションを書いてみます。 図007■DisplayObject.removedFromStageイベントリスナーに後かたづけの処理を定める ムービーが[TLFテキスト]を含まなければ、DisplayObjectContainer.removeChild()メソッドでインスタンスを親タイムラインの表示リストから除いたとき、リスナー関数が呼出されます。これが本来期待する動きです。ところが、ムービー内に[TLFテキスト]を置くと、たちまちこの期待が裏切られます。 たとえば、先ほどフレームアクションを設定した前掲図007のMovieClipシンボルに、[TLFテキスト]をひとつ置いてみます(図008左図)。すると、[2]から[3]に移るときDisplayObject.removedFromStageイベントが起こるため、[4]の普通の状態になったときには、イベントリスナーが呼出されてしまっています(図008右図)。 図008■MovieClipシンボルに[TLFテキスト]を置く後述するとおり、Flash Player 10.2ではDisplayObject.removedFromStageイベントは呼ばれません。したがって、Flash Player 10や10.1も含めて、いずれでも同じようにイベントを扱おうとすれば少しひねりが求められます。具体的には、「TLFテキストを含むインスタンスがステージの表示リストから除かれるとき」をお読みください。
03 Flash Player 10.2における[TLFテキスト]をもったメインタイムラインの動き
[1]まず、メインタイムラインのインスタンスがつくられるとき、いずれの表示リストにも属しません。つまり、親のないインスタンスとして生まれます。 [2]つぎに、プリローダのインスタンスとメインタイムラインがともにStageオブジェクトの子として表示リストに加わります。ただし、メインタイムラインは第二子(インデックス1)です。 [3]最後に、プリローダが消し去られると、タイムラインはStageオブジェクトの第一子(インデックス0)に繰り上がり、親ひとり子ひとりの普通の関係に落着きます。この状態に至れば、[TLFテキスト]があることをとくに気にかけなくて済みます。 [1]は前項のCS5(Flash Player 10または10.1)と同じですので、ドキュメントクラスのコンストラクタメソッドからプロパティ(DisplayObject.stageプロパティなど)を参照するときに注意が必要です。 [2]では、親インスタンス(DisplayObject.parentプロパティ)はStageオブジェクトになりますので問題ありません。しかし、Stageオブジェクトのインデックス0の子(stage.getChildAt(0))が、メインタイムラインでなくプリローダを参照します。また、前出「TLFテキストのある外部SWFを読込むとその中のオブジェクトにアクセスできない」問題は、やはり生じます。 [1]から[2]でDisplayObject.addedToStageイベントは起こるものの、CS5(Flash Player 10または10.1)とは異なり、DisplayObject.removedFromStageイベントが生じることはありません。 04 [TLFテキスト]のActionScriptライブラリをSWFに埋込む [TLFテキスト]のActionScriptライブラリをSWFファイルに埋込むには、[パブリッシュ設定]([ファイル]メニュー)の[Flash]タブにある[スクリプト]の{ActionScript設定」ボタンで[ActionScript 3.0の詳細設定]ダイアログボックスを開きます。そして、[ライブラリ]タブにある[ランタイム共有ライブラリ設定]の[デフォルトリンケージ]から[コードにマージ]を選んで、[OK]ボタンをクリックします(図010)。 図010■[ランタイム共有ライブラリ設定]の[デフォルトリンケージ]から[コードにマージ]を選ぶ これで、Flashムービーの中に[TLFテキスト]があっても、メインタイムラインは普通どおり初めからStageオブジェクトのただひとりの子になります(前掲図001)。 作成者: 野中文雄 Copyright © 2001-2012 Fumio Nonaka. All rights reserved. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||