[AS3] ActionScript 3.0で外部テキストファイルを読込む [Edit]

ActionScript 3.0では、外部テキストファイルを読込むLoadVarsクラスがなくなります[*1]。その替わりに用意されたのが、flash.net.URLLoaderクラスです[*2]。URLLoaderクラスを使った外部テキストファイルの読込みについてご紹介します。

URLLoaderクラスを使った外部テキストファイルロードの流れ

URLLoaderクラスを使うには、まずインスタンスを作成し、URLLoader.load()メソッドで外部テキストファイルをロードします。この手順は、基本的にLoadVarsクラスを使った場合と同じです。

ただし、ActionScript 3.0で外部ファイルを読込む際には、2.0のように単純にそのファイルのURLをロードのメソッドに渡すのではありません。外部ファイルの基本情報を備えたflash.net.URLRequestインスタンスを作成して、それを指定する必要があります。もちろん、URLRequestインスタンスの情報のうちもっとも重要なのは、外部ファイルのURLになります。

一般に外部ファイルを読込んで処理する場合、そのロード待ちをしなければならないことが通常です。URLLoaderインスタンスの場合は、flash.events.EventクラスのEvent.COMPLETEイベントが読込み終了時に発生します。したがって、そのイベントリスナーを登録します。

URLLoaderインスタンスには、デフォルトでは外部テキストがそのままURLLoader.dataプロパティにロードされます。ですから、そのテキストを「変数=値」のかたちに変換(デコード)しなければなりません。そのためのクラスがflash.net.URLVariablesです。URLVariablesインスタンスを生成するとき、外部ファイルから読込んだテキストを引数に指定すると、コンストラクタが自動的にこのデコードを行ってくれます。

「変数=値」のかたちに変換されたデータは、URLVariablesインスタンスのプロパティ(変数)として格納されます。その値の取出し方は、LoadVarsインスタンスの場合と基本的に変わりません。

URLLoaderクラスを使った外部テキストファイルロードのサンプル

では、実際にURLLoaderクラスを使ってみましょう。以下のような外部テキストファイルを用意して、その変数をロードするサンプルスクリプトです(スクリプト001)。テキストファイルはtest.txtという名前で、SWF(およびそれを埋込んだHTML)ファイルと同階層にあるものとします。

    sName=Fumio+Nonaka&sHobby=Bug+Fix

スクリプト001■URLLoaderを使った外部テキストファイルのロード
// フレームアクション
// [1] 使用するクラスのインポート
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.events.Event;
// [2] URLLoaderとURLRequestインスタンスの生成
var myLoader:URLLoader = new URLLoader();
var myRequest:URLRequest = new URLRequest("test.txt");
// [3] ロード完了時の処理をイベントリスナーに登録
myLoader.addEventListener(Event.COMPLETE, onComplete);
// [4] 外部テキストファイルのロード実行
myLoader.load(myRequest);
// [5] リスナー関数の定義
function onComplete (eventObject:Event):void {
  var my_str:String = eventObject.target.data
  var myVars:URLVariables = new URLVariables(my_str);
  for (var name_str:String in myVars){
    trace([name_str, myVars[name_str]]);
  }
}

[1] インポートするクラスは、flash.netパッケージからURLLoaderとURLRequest、URLVariablesの3つ、それにflash.events.Eventになります。

[2] 外部テキストファイルを読込むためには、まずURLLoaderとURLRequestクラスのインスタンスを生成します。URLRequestクラスのコンストラクタ関数には、ロードする外部ファイルの情報として、文字列のURLを渡します。

[3] URLLoaderインスタンスには、外部テキストファイルがロードし終わったときのイベントEvent.COMPLETEに対して、イベントリスナー関数を登録します。

[4] イベントリスナーを登録した後、URLRequestインスタンスを引数として、URLLoader.load()メソッドの呼出しを行います。

[5] イベントリスナー関数を定義して、外部テキストファイルの処理を記述します。

イベントリスナー関数には、一般に引数としてイベントの情報を格納したオブジェクトが渡されます(Event.COMPLETEイベントの場合は、Event型)。イベントオブジェクトはEvent.targetプロパティをもち、その値としてイベントの発生したターゲットインスタンスへの参照が格納されます。このサンプルスクリプトでは、外部テキストファイルをロードしたURLLoaderインスタンスが納められます。

ロードされた外部ファイルのテキストは、URLLoader.dataプロパティにそのまま文字列として設定されます。「変数=値」のかたちに変換するためには、この文字列を引数としてURLVariablesコンストラクタに渡し、インスタンスを生成すればよいでしょう[*3]

URLVariablesインスタンスからの変数値の取出しは、LoadVarsインスタンスの場合と基本的に同じです。このサンプルでは、for..inステートメントを使って、すべての変数とその値をtrace()ステートメントで出力しています。外部テキストファイルが上述の内容であれば、[Output]パネルにはつぎのように表示されます。

    sName,Fumio Nonaka
    sHobby,Bug Fix

[*1] LoadVarsクラスを用いた外部テキストファイルのロードについては、「LoadVarsオブジェクトを使った外部テキストファイルの読込み」をご参照ください。

[*2] URLLoaderクラスについては、akihiro kamijo「URLLoaderクラス」をご参照ください。

[*3] ActionScript 3.0 Sample「外部テキストを変数に読み込む(フレーム内)」は、URLLoader.dataFormatプロパティを使って、URLLoader.dataにロードされたテキストを直接「変数=値」のかたちに変換しています。

コメント

この記事へのコメント

  1. 1.レン(2011年09月20日 17:14)

    このままではバグが出ますので正しくはこうですね

    var myRequest:URLRequest = new URLRequest("text.txt");
    var myLoader:URLLoader = new URLLoader(myRequest);
    // [3] ロード完了時の処理をイベントリスナーに登録
    myLoader.addEventListener(Event.COMPLETE, completeHandler);
    // [4] 外部テキストファイルのロード実行
    myLoader.load(myRequest);

  2. 2.野中 文雄(2012年02月15日 15:24)

    すみません。コメントに気づきませんでした。

    URLLoader()コンストラクタの引数はオプションです。省いた場合には、URLLoader.load()メソッドにURLRequestオブジェクトを渡せばロードが行われます。
    http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/net/URLLoader.html#URLLoader()

    他方、コンストラクタに引数を渡すと、「直ちにロード操作が開始されます」。したがって、このときURLLoader.load()メソッドは呼出す必要がありません。また、Event.COMPLETEベントのリスナーは先に登録した方が安心でしょう。

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

トラックバック

この記事へのトラックバック

  1. Case Study:02(AS3.0 Ver.) テキストファイル読み込みによるコンテンツの動的更新(2010年03月12日 18:15)

    「ActionScript3.0を駆使したプロフェッショナルテクニック」を謳っていながら肝心のサンプルにActionScript2.0が混在しているという...
    from ツチノコラボ

その他の記事