プロが教える店舗&オフィスのセキュリティ対策術

flashでタイピングゲームを作成しています。
問題を外部テキストファイルから一行単位で読み込み、
それを配列に保存し、ランダムで出力するという仕様です。
外部テキストファイルの読み込み方、一行単位での配列への保存がわかりません。

外部テキストファイル名 elang.txt
//////////中身//////////////
FOOT
HAND
HEAD
////////////////////////////

/////////読み込みソース//////////////////
i = 0; //ループ変数
elangword = new Array(); //配列
/////////////////////////////////////////

読み込みソースはここまでしかできていません。
問題出力ソースはできています。
外部テキストファイルの中身の変更、読み込みソースの
変更をしてもかまいませんので、どなたがご教授していただけたら幸いです。
どうかよろしく御願い致します。

補足
C言語の知識はある程度あります。

/////////開発環境/////////////////
windows xp sp2
Flash Mx
/////////////////////////////////

A 回答 (3件)

他の方のでも解決可能かと思います。


実験していないので、無責任なアドバイスですが、splitを使うのはどうでしょう?
読んだテキストを、nowLoadTextとして、

elangword = nowLoadText.split("\n")

としたら配列で入りませんかね。改行コードは\n以外でしたら別指定して下さい。
    • good
    • 0

Flash でのテキストファイルの読み込みはC言語とは違い、文字列ではなく変数として読みます。


例えば、テキストファイルの内容が次のようになっていたとしますと。

 test=テスト

これをC言語で読むと「test=テスト」という1つの文字列になってしまいますが、Flash では、変数 test が定義され、その中に「テスト」の文字列が格納されます。
& でつなげると、複数の変数を読むこともできます。例えば、

 test1=テスト1&test2=テスト2

この場合は、test1 と test2 という2つの変数に、それぞれ「テスト1」と「テスト2」の文字列が格納されます。

このように、Flash でのテキストファイルは全て、変数として読み込むことになります。
配列変数は残念ながら読むことができないのですが、代わりに、文字列を指定の区切り文字で分割し、配列に格納するというスクリプトがあります。
読み込むテキストファイルは、

 test=FOOT,HAND,HEAD

といった具合に、各文字列を” , ”などで区切っておきます。
テキストファイルから test を読み込み、String オブジェクトの split メソッドで加工すると、文字列を配列に1つずつ格納できます。


Flash はテキストファイル以外にも、JPEG 画像と swf ファイルを読み込むことができます。
どの外部ファイルを読む場合もそうですが、読み込みにかかる時間を考慮するようにしましょう。
外部からデータを読む LoadVars や loadMovie は、”○○ファイルを読み込め”の命令を出すだけです。読み込みが終わるまでスクリプトの実行がそこで止まるのではなく、次のスクリプトを実行しながら、その裏で読み込みが続行されます。
読み込みが終わらないうちに先に進むと、利用しようとした変数が未定義( undefined )になっていたり、画像やムービーが表示されないなど、バグの原因になります。
よって、読み込んだ変数や画像・ムービーを利用して何かをする場合は特に、読み込みの終了を待ってから先に進むことが重要です。

読み込みの終了を待つにはいろいろな方法がありますが、よく使われるのは、読み込みの終了を知らせるフラグを用意し、このフラグを監視して先に進むという方法です。
フラグの監視はフレームで行います。
ただし、フレームアクションは再生ヘッドがそのフレームに来た、その時1度しか実行されないので、いつか値が変わる、といった動作のフラグを監視するには工夫が必要です。
しかし、これは複数のフレーム間を行き来すれば、その都度フレームアクションは実行されるということですから、この特徴を利用します。フラグの監視には、よく使われる手法です。

読み込みに関するフレームの構成をまとめますと、次のような流れになります。

 フレーム1:初期設定と読み込み
 フレーム2:読み込み終了を待つためのダミー。何もしない
 フレーム3:読み込みの終了を待って先に進む


テキストファイル「 elang.txt 」の中身を、

 test=FOOT,HAND,HEAD

このような形で記述しておきます。区切りの文字は、半角( ASCII 文字)の文字であれば何でも構いません。
これを読み込み、各単語を配列 elangword に格納するスクリプトは、大体、次のようになります。
(↓このスクリプトをコピーして利用する場合は、各行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります)

 ・フレーム1に設定するスクリプト

  //読み込み終了フラグ
  //終了時true、それ以外はfalse
  load_status = false;

  //Shift-JISで読み込む
  System.useCodepage = true;

  //LoadVarsオブジェクトの生成と読み込み
  load_obj = new LoadVars();
  load_obj.load( "elang.txt" );

  //読み込み終了時の処理
  load_obj.onLoad = function( success )
  {
   //正常に終了した場合、完了を知らせる
   if( success )
   {
    load_status = true;
   }
  };

onLoad は LoadVars.load での読み込みが終わった時に発生するイベントで、この時に実行する処理を関数として定義しておくことができます。
onLoad で定義する関数の引数 success には、読み込みが正常に終了した時に true 、失敗した時に false が渡されます。ここでは、正常終了時に終了をタイムラインに知らせる意味で、用意したフラグを true にしています。
なお、読み込むテキストファイルを、文字コード UTF-8 ( Unicode )形式で記録している場合は、

  //Shift-JISで読み込む
  System.useCodepage = true;

この部分は削除してください。文字化けの原因になります。


 ・フレーム3に設定するスクリプト

  //読み込みが終了した場合
  if( load_status )
  {
   //Stringオブジェクトの生成
   str = new String( load_obj.test );

   //読み込んだテキストを”,”で分割し、配列に格納する
   elangword = str.split( "," );
  }
  //それ以外の場合は読み込みの終了を待つ
  else
  {
   gotoAndPlay( 2 );
  }

読み込みが終わると、読み込みを実行した LoadVars オブジェクトに変数が定義され、読んだデータはその中に入っています。上記の例では、load_obj に test という変数が定義されていて、その中身は

 FOOT,HAND,HEAD

となっています。
これを、String オブジェクトで加工します。

String オブジェクトは、まず、操作する文字列を決めます。ここでは、load_obj.test に入っている文字列、ということになります。
split メソッドで、” , ”を区切りとして分割し、配列 elangword に1つずつ格納します。
elangword の中身は、

 elangword[0] → FOOT
 elangword[1] → HAND
 elangword[2] → HEAD

となります。


区切り文字を” , ”にしますと、利用したい文字列の一部に” , ”がある場合でも、強制的にここで分断されてしまいます。
タイピング練習であまり使わない文字というと、水平タブ( \t )などではないでしょうか。
テキストファイルで水平タブを挿入する時は、\t ではなく、URLエンコード %09 で挿入します。
テキストファイルに

 test=FOOT%09HAND%09HEAD

split では、

 elangword = str.split( "\t" );

と記述すると、” , ”を使う文字列も分割されずに、配列に格納することができます。


長くなってすみませんでした。
不明な点がありましたら、補足してください。
    • good
    • 0

C言語の知識があるのであれば、Flashが変数として


読み込めるようにelang.txtの内容を書き換えてみましょう。
私が適当に書いたプログラムです。
----------------------------------------------
#include<stdio.h>

main() {

char str1[256]; //一行読み込みの配列
char str2[256]; //テキスト整形の配列
FILE *fin=fopen("elang.txt", "r");
FILE *fout=fopen("elang_flash.txt", "w");
int i=0;

while(fgets(str1, sizeof str1, fin) != NULL) {
if(i==0) {
sprintf(str2,"elangword[%d]=%s", i, str1);
} else {
sprintf(str2, "&elangword[%d]=%s", i, str1);
}
fputs(str2, fout);
i++;
}
fclose(fin);
fclose(fout);
}
------------------------------------------------
ためしに実行してみたところ、
////////////////////
elangword[0]=FOOT
&elangword[1]=HAND
&elangword[2]=HEAD
////////////////////
の内容のテキストファイルが作成できました。
この形になるとLoadVarsオブジェクトを使用して
変数として読み込むことができると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!