• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:読み込んだテキストを Split で分割する)

FlashのloadVariablesでテキストファイルを読み込み、splitして配列に格納する方法がわからない

このQ&Aのポイント
  • FlashのloadVariablesを使用してテキストファイルを読み込む際に、splitを使用して改行で区切って配列に格納したいですが、うまくいきません。
  • また、loadVariablesとは別の方法で同じことを行った場合、配列の値を他のフレームやムービークリップから参照することはできるのでしょうか?
  • 環境はWindows XPでFlash MX 2004を使用しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

#1です。 結論から書きますと、  //Shift-JISで読み込む  System.useCodepage = true;  load_obj = new LoadVars();  load_obj.load( "sample.txt" );  load_obj.onLoad = function( success )  {   //正常終了時、改行コードで分割して配列に格納   if( success )   {    my_ary = new Array();    my_ary = load_obj.txt.split( "\n" );    //読み込みの終了を待って、先に進む    gotoAndStop( 2 );   }  };  //一旦、メインのタイムラインを止める  stop(); で、いかがでしょう。 ActionScript では、CGIやテキストファイルから外部変数の他に、JPEG 画像や swf ファイルを読み込むこともできます。 どの読み込みの場合でも、「○○を読み込め」の命令を出したら loadVariables などの読み込み関連のスクリプトは終了で、すぐに次のスクリプトの実行に移ります。 他のスクリプトやフレームの再生等を続けながら、読み込みの命令に従って裏で読み込みが続行されます。 この読み込みが済んだ時に data や load イベントが発生し、イベント発生時の処理が onData もしくは onLoad で定義されていれば、この時に実行されるのです。 テキストファイルは画像や swf フィイルに比べれば、容量が小さく単純なデータです。 それでも、ファイルを開いてデータを読み込み、変数と値に分割してファイルを閉じる・・・といった処理が、読み込みの命令を出した次の一瞬で終わることは、まずありえません。 スクリプトや再生ヘッドは読み込みの終了を待つことなく先に進みますから、読み込みが終わっていなくてもフレーム2に進みます。 フレームアクションは再生ヘッドがフレームに来た、その時1度だけ実行されるので、フレーム2のスクリプトは実行されます。また、フレーム2にあるムービークリップの load イベントを使ったスクリプトも実行されます。 ところが、この時点ではまだ変数の読み込みが済んでいないため、読み込みが済んだ時に定義される my_ary は未定義( undefined )のままです。 一旦フレーム1でタイムラインを止めておいて、onLoad で定義した処理が実行されるのを待ってから先に進むようにすると、フレーム2が再生される時には my_ary は定義されていることになります。 外部から読み込んだものを使って何かをする時は、読み込みが正常に完了したことを確認してから先に進むことが大切です。 読み込みが終わる前に進むと、参照したい対象が未定義になっているために次の処理も失敗してしまいます。 ちなみに、読み込み完了を待つ処理は様々です。 イベントが発生しないものや1つのイベントだけでは終了の検出が難しいものなどの場合は、フレームに読み込み終了を検出するためのスクリプトを書いておいて、フレーム間をループして何度もこのスクリプトを実行させ、条件が成立するのを待って先に進む方法もあります。

cordierite
質問者

お礼

早速のご返答、感謝いたします。 お教えいただいたソースコードを試してみたところ、うまくいきました。 データがきちんと読み込まれるまで待つ処理を、きちんと書いておくことが大切なんですね。 ありがとうございました!

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

テキストファイルの記述が  txt = ・・・ と、イコール( = )の前後にスペースが入っているために、読み込まれた時に内部で”変数と、その値”に分割する処理が失敗しているようですね。 デバッガで変数 txt が存在しているかのように表示されるのが不思議ですが、  trace( this.txt ); では undefined と出てきます。 イコールの前後に入っているスペースを削除してみてください。 変数 txt として読み込めますし、\n で split もできます。 なお、& は複数の変数を読み込む時に付けるものなので、変数が1つならば不要です。 -------------------------------------------------------- loadVariables で読み込んだ変数は、読み込み先のムービークリップのものになります。 例えばメインのタイムラインで  this.loadVariables( "sample.txt" ); とすると、変数 txt は _root 階層のものになります。 LoadVars で読み込んだ変数は、読み込みを担当した LoadVars オブジェクトのものになっています。 onLoad イベントを利用してこの値を他の変数に代入すると、その変数はどこからでも参照できます。 例えば、メインのタイムラインに  //Shift-JISで読み込む  System.useCodepage = true;  load_obj = new LoadVars();  load_obj.load( "sample.txt" );  load_obj.onLoad = function( success )  {   //正常終了時、改行コードで分割して配列に格納   if( success )   {    my_ary = new Array();    my_ary = load_obj.txt.split( "\n" );   }  }; (↑各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) というスクリプトを書くと、my_ary は _root のものになり、他のフレームやムービークリップ等からでも参照できます。 もっとも、メインのタイムラインで定義した LoadVars オブジェクトは、delete アクションで削除しない限りはフレームやシーンが変わっても存在しています。 Loadvars オブジェクト名.変数名(上記の例では load_obj.txt )としても、どのフレームやムービークリップからでも参照できます。 ただし、フレームやムービークリップから変数を参照する時はターゲットパスにご注意ください。 ActionScript は、参照しようとする変数や関数・インスタンスがある階層にうるさい言語です。参照したいものがどの階層にあるのか、その持ち主をはっきり指定して参照しなければなりません。 この持ち主の指定のことを”ターゲットパス”といいます。 ターゲットパスは自分の持ち物であれば省略できますが、他の階層にあるものならばその持ち主までのターゲットパスが必要です。 面倒にも見えますが、この仕組みのおかげで、同じシンボルから作られた複数のインスタンスが全く同名のインスタンス等を持っていても、それぞれ違うものとして識別され、個別に操作できるのです。 ターゲットパスさえ正しく指定できていれば、どこの階層にあるものでも自由に参照できます。 _root とはメインのタイムラインおよびステージを指します。 ステージにあるインスタンスやメインのタイムラインで定義した変数・関数は、特に断りがない限りは全て _root の持ち物です。 メインのタイムラインで my_ary を参照したい時は、ターゲットパスを省略して  my_ary[ 0 ] としてもいいですし、自分自身を指す this を使って  this.my_ary[ 0 ] とすることもできます。 仮に、ステージにムービークリップ clip があるとします。 clip から先述の my_ary を参照する時は、my_ary は自分の持ち物ではありませんから、ターゲットパスが必要になります。 my_ary は _root の持ち物ですので、  _root.my_ary[ 0 ] このように持ち主を指定して参照します。 clip は _root の子です。 子から親を指す相対表現の _parent を使って  _parent.my_ary[ 0 ] と書くこともできます。 ターゲットパスを自動で入力してくれる機能があります。 「アクション」パネルの上部に並んだ7つのアイコンのうち、中央のアイコンをクリックすると、ターゲットのリストが出てきます。 そのリストから選ぶだけで、今の階層を基準にしたターゲットパスを入力できます。 ターゲットパスがよく分からない時には利用してみてください。

cordierite
質問者

補足

素早い回答&丁寧な解説ありがとうございます。 >イコール( = )の前後にスペースが入っているため 本当ですね! ついうっかりしてました。 ご指摘ありがとうございます。 あとそれから LoadVars についてですが、お教えいただいたように、  System.useCodepage = true;  load_obj = new LoadVars();  load_obj.load( "sample.txt" );  load_obj.onLoad = function( success )  {   if( success )   {    my_ary = new Array();    my_ary = load_obj.txt.split( "\n" );   }  }; とメインのタイムライン1フレーム目に書いて (スペースはタブに直して)、 そしてメインのタイムライン2フレーム目に、 a = my_ary[0]; と書き、 さらに2フレーム目、ステージに配置したムービークリップに、 onClipEvent (load) { b = _root.my_ary[1]; } と、それぞれ my_ary の値を参照するよにと書いてみたのですが、ab いずれも undefind になってしまいます。 何故なのでしょうか? 宜しくお願いいたします。

すると、全ての回答が全文表示されます。

関連するQ&A