サイトトップ

Director Flash 書籍 業務内容 プロフィール

Adobe Flash非公式テクニカルノート

SafeLoaderクラスを使う

ID: FN1201001 Product: Flash CS5 and above Platform: All Version: 10 and above/ActionScript 3.0

TLFテキストのある外部SWFを読込むとその中のオブジェクトにアクセスできない」場合があります。この問題に対処するため、AdobeはSafeLoaderクラスを公開しました。本稿では、このクラスの使い方を簡単にご紹介します。


01 TLFテキストはデフォルトではランタイム共有ライブラリとして読込まれる
TLFテキスト(TFLTextFieldインスタンス)またはText Layout Frameworkを扱うActionScriptライブラリは、デフォルトではランタイム共有ライブラリとして読込まれます。そのロードと初期化の間に、メインタイムラインが密かに表示リスト間をさまよいます。そのため、TLFテキストが含まれた外部SWFを読込んですぐコンテンツのメインタイムラインにアクセスしようとしても、初期化が済むまでアクセスできないのです。

また、表示リストにおけるタイムラインの動きは、Flash Professional CS5とCS5.5では異なることに注意が必要です。詳しくは、「TLFテキストが配置されたメインタイムラインの初期化」をお読みください。けれど、いずれにしてもTLFテキストの初期化が済みさえすれば、普通のSWFと同じようにタイムラインにアクセスできます。その機能を提供するのが、SafeLoaderクラスです。


02 SafeLoaderクラスのインストール
SafeLoaderクラスは、Adobeの英文ドキュメント「Loading child SWFs with TLF content generates reference errors[*1]からダウンロードできます。「Solution 2」という項に「SafeLoader」というリンクがありますので、ZIPファィルを取得します(図001)。

図001■Adobeの英文ドキュメントのリンクからZIPファィルをダウンロードする
図001

解凍したSafeLoaderフォルダには、FLAファイルと「fl」というフォルダが入っています(図002)。FLAファイルはサンプルで、SafeLoaderクラスを使うのに必要なASファイルはflフォルダに含まれています。このflフォルダをソースパス(クラスパス)に置いてください。

図002■解凍したSafeLoaderフォルダの中身
図002

ActionScript 3.0のソースパスについては、「ActionScriptパブリッシュ設定」の「ActionScriptファイルの場所の設定」の項をお読みください。ソースパスについてまだ学習されていない場合には、flフォルダはSafeLoaderクラスを使うFLAファイルと同じ場所にコピーすればよいでしょう(図003)[*2]

図003■flフォルダはSafeLoderクラスを使うFLAファイルと同じ場所にコピーしてもよい
図003

[*1] Text Layout Frameworkが含まれた外部SWFをロードした場合のエラーについて、その対処法を説明しています。ただ、そのエラーがどのような場合に起こるのかは書かれていません。おそらく、前出「TLFテキストのある外部SWFを読込むとその中のオブジェクトにアクセスできない」という問題について述べたものと思われます。

[*2] クラスを使うFLAファイルと同じ階層は、ソースパスのひとつです。[パブリッシュ設定]の[ActionScript 3.0詳細設定]で[ソースパス]のタブを開くと、デフォルトではドット(.)が示されます(図004)。これはクラスを使うFLAファイルと同じ階層という意味です。

図004■[パブリッシュ設定]の[ActionScript 3.0の詳細設定]で[ソースパス]を確かめる
図004


03 クラスSafeLoaderとSafeLoaderInfoの使い方
前項で設定したfl.displayパッケージには、ふたつのクラスSafeLoaderとSafeLoaderInfoのASファイルが納められています(前掲図002参照)。これらのクラスについてのドキュメントは、Adobeのサイトに見当たりません。もっとも、使い方としてはスクリプトの中のLoaderとLoaderInfoクラスを、それぞれSafeLoaderとSafeLoaderInfoクラスに置換えるだけです。

本稿の初めに引用した「TLFテキストのある外部SWFを読込むとその中のオブジェクトにアクセスできない」で、外部SWFのメインタイムラインにアクセスできないためにエラーが出るとした例をお題にしましょう。外部SWFのメインタイムラインにはTLFテキストがひとつ置いてあり、my_txtとインスタンス名をつけてあります。そして、読込むローダー側のメインタイムラインには、つぎのフレームアクションを書きます。なお、外部SWFのファイル名はsub.swfとしました。

var myLoader:Loader = new Loader();
var myInfo:LoaderInfo = myLoader.contentLoaderInfo;
var myURL:URLRequest = new URLRequest("sub.swf");
myInfo.addEventListener(Event.COMPLETE, xLoaded);
myLoader.load(myURL);
addChild(myLoader);
function xLoaded(eventObject:Event):void {
  var my_mc:MovieClip = myLoader.content as MovieClip;
  my_mc.my_txt.text = "success";   // インスタンスmy_txtが見つからない
}

LoaderInfo.completeイベント(定数Event.COMPLETE)で外部SWF(sub.swf)のロードが終わるのを待ち、そのメインタイムラインをLoader.contentプロパティにより参照しようとしています。ところが、前述01「TLFテキストはデフォルトではランタイム共有ライブラリとして読込まれる」にご説明したとおり、TLFテキストの初期化が済むまでメインタイムラインにはプロパティからアクセスできないので、つぎのようにランタイムエラー#1069が示されます。

ReferenceError: Error #1069: sub_fla.MainTimeline__Preloader__ にプロパティ my_txt が見つからず、デフォルト値もありません。

メインタイムラインが参照できなければ、当然そこにあるTLFテキストにもアクセスできないということです。このサンプルとエラーの中身について詳しくは、前出「TLFテキストのある外部SWFを読込むとその中のオブジェクトにアクセスできない」をご参照ください。

さて、このフレームアクションのLoaderとLoaderInfoクラスを、それぞれSafeLoaderとSafeLoaderInfoクラスに置換えたのが、つぎのスクリプト001です。書替えたステートメントは、コメントとして残しました。

スクリプト001■SafeLoaderクラスで外部SWFを読込んでコンテンツにアクセスする
  1. import fl.display.*;
    // var myLoader:Loader = new Loader();
  2. var myLoader:SafeLoader = new SafeLoader();
    // var myInfo:LoaderInfo = myLoader.contentLoaderInfo;
  3. var myInfo:SafeLoaderInfo = myLoader.contentLoaderInfo;
  4. var myURL:URLRequest = new URLRequest("sub.swf");
  5. myInfo.addEventListener(Event.COMPLETE, xLoaded);
  6. myLoader.load(myURL);
  7. addChild(myLoader);
  8. function xLoaded(eventObject:Event):void {
  9.   var my_mc:MovieClip = myLoader.content as MovieClip;
  10.   my_mc.my_txt.text = "success";
  11. }

まず、fl.displayパッケージのふたつのクラスは、import宣言しなければなりません(スクリプト001第1行目)。あとは、データ型の指定とコンストラクタメソッドのLoaderとLoaderInfoクラスを、それぞれSafeLoaderとSafeLoaderInfoクラスに書替えるだけです(第2〜3行目)。SafeLoaderクラスのプロパティ(content)やメソッド(load())、それにSafeLoaderInfoクラスのイベント(complete)などがLoaderやLoaderInfoクラスと合わせてありますので、ほかには手を加えずに済みます。

[ムービープレビュー]を確かめると、SafeLoaderInfo.completeイベントでSafeLoader.contentプロパティにより、外部SWFのメインタイムラインが正しく参照できます。そして、メインタイムラインに置いたTLFテキストインスタンス(my_txt)のTLFTextField.textプロパティに、文字列("success")が設定されます(図005)。

図005■外部SWFのメインタイムラインに置いたTLFテキストに文字列が設定された
図005

SafeLoaderクラスは、TLFテキスト初期化のプロセスが異なるFlash Professional CS5とCS5.5のどちらでも同じように使えます。また、ロードする外部SWFがTLFテキストを含まない場合でも動きは変わりません。


作成者: 野中文雄
作成日: 2012年1月3日


Copyright © 2001-2012 Fumio Nonaka.  All rights reserved.