アプリ版:「スタンプのみでお礼する」機能のリリースについて

どなたか教えて下さい。FLASHにて外部テキストを読み込み、その読み込む文によってMCを表示・非表示させたくて下記のようにソースを書いたのですが、変数のw03の部分をakairo以外の文字にしてもaka(MC)が表示されてしまいます。。。
akairo意外の文字にした場合、ao(MC)が表示になるようにしたいのですが、どなたか教えて頂けると幸いです。よろしくお願いします。

this.stop();
System.useCodepage = true;
g01.loadVariables("test.txt"); //外部読み込み
if (g01.w03 == akairo) { //もしg01内のダイナミックテキストw03の読み込んだ文字が akairo なら
aka._visible = true; //aka(MC)を表示
ao._visible = false; //ao(MC)を非表示
}else{ //そうでなかったら
ao._visible = true; //ao(MC)を表示
aka._visible = false; //aka(MC)を非表示
}

外部テキスト(test.txt)は
w01=ワード01&w02=ワード02&w03=akairo
になっています。

A 回答 (1件)

問題が2点、あります。




ActionScript では、外部から値や画像などのファイルを読み込む場合、「○○を読み込め」という命令を出したら、読み込みが終わるまで待たずに、すぐに次の命令が実行されます。
しかし、どんなに単純なテキストファイルであっても、たとえ通信回線を介さないローカル環境であったとしても、ファイルを開き、値を読み込み、内容を解析してファイルを閉じる処理がほんの一瞬で終了することは、まずあり得ません。
読み込みが完了する前に読み込まれるはずのものを利用しようとすると、思わぬ不具合の原因になります。

簡単に言いますと、loadVariables 等の読み込みの命令のすぐ後に、読み込まれるはずの変数などを利用するスクリプトを書いても、正常に動作しない場合の方が多いということです。
ですから、ActionScript で何かを読み込む場合は必ず、”読み込みが完了した後で読み込んだものを利用する”という形でスクリプトを書きます。


ご提示のスクリプトですと、読み込みの完了を待つ部分が抜けているようです。
テキストファイルに

 変数名=値&変数名=値

という形で記述して読み込むと、読み込みが完了した後でテキストファイルに書かれていた名前の変数が作られて、指定の値が格納されます。
スクリプトで予め同名の変数が作られている場合を除き、読み込みが終わる前までは、その名前の変数は存在していません。

存在しない変数の中身を見ると、” undefined ”(未定義)という値が入っているものと見なされます。
つまり、ご提示のスクリプトですと、if 文の条件にある変数 g01.w03 には undefined という値が入っているものと見なされた状態で、条件の判断が行われてしまいます。


もう1つの問題点は、g01.w03 の値を判別する部分です。
外部テキストから読み込まれた値は、文字列になります。
変数にある文字列が入っているかどうかを判別するには、

 if( g01.w03 == "akairo" )

↑このように、判別したい文字列を " " で囲みます。

 if( g01.w03 == akairo )

と書くと、g01.w03 と変数 akairo に入っている値が同じであるかどうか、という条件になります。

おそらく akairo という名前の変数は存在しておらず、変数 akairo の値が未定義= undefined になっているかと思われます。
すると、

 if( g01.w03 == akairo )

↑この if 文は

 if( g01.w03 == undefined )

と同じ意味になります。


読み込みの完了を待たずに g01.w03 の値を見ようとすると、g01.w03 がまだ存在していないために、g01.w03 の値は、テキストファイルに何が書かれていたかに関係なく undefined と見なされます。
変数 akairo も存在しておらず undefined だとすれば、ご提示のスクリプトですと、w03 の内容が何であれ、必ず if 文の条件が成立してしまいます。
そのため、テキストファイルの w03 の部分に” akairo ”以外の文字を指定しても、常に aka のムービークリップが表示されることになります。

-----------------------------------------------------------

読み込みの完了を待つ方法はいろいろありますが、loadVariables で読み込む時は、読み込みが終わった時に発生する” data ”というイベントを利用して読み込みの完了を検出することができます。


ステージにムービークリップシンボルのインスタンス ao ・ aka と g01 があり、外部テキストファイル test.txt の内容は

 w01=ワード01&w02=ワード02&w03=akairo

とします。
test.txt を読み込み、変数 w03 の値が” akairo ”の時は aka のムービークリップを、それ以外の時は ao のムービークリップを表示するスクリプトは、大体、次のようになります。
このスクリプトは、メインのタイムラインに設定してください。
FlashPlayer 6 以降、ActionScript 1.0 または 2.0 で動作します。

(↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください。このまま使うと、シンタックスエラーになります)


/*****************************************************/


 //タイムラインを止めておく
 this.stop();

 //aoとakaのムービークリップをとりあえず非表示にしておく
 ao._visible = false;
 aka._visible = false;


 //読み込みが終了した時の処理
 g01.onData = function()
 {
  //色の指定を判別
  //変数w03の内容が”akairo”ならakaのムービークリップを表示
  if( g01.w03 == "akairo" )
  {
   aka._visible = true;
   ao._visible = false;
  }
  //それ以外の時はaoのムービークリップを表示
  else
  {
   ao._visible = true;
   aka._visible = false;
  }
 };

 //Shift-JISで読み込む
 System.useCodepage = true;
 g01.loadVariables( "test.txt" );


/*****************************************************/


ActionScript では、テキストファイルだけでなく、画像や swf ファイル、CGI といってサーバーで実行されるプログラムが生成する値なども読み込んで利用することができます。
何を読み込む場合でも、読み込みの完了を待ってから読み込んだものを利用することが大切です。
読み込みにかかる時間は読み込むものや回線・サーバーの都合などによって変動するため、ActionScript には、読み込みが終わった時に合わせてスクリプトを実行できる仕組みが用意されています。
読み込み完了を待つ処理は、どんな命令を使って読み込みを実行したかによっても作り方が違います。

上記のスクリプトでは、読み込みにムービークリップが持っている loadVariables 命令を使い、onData = function という形式で読み込みの完了を待って ao または aka のムービークリップを表示する処理を作っています。


ここでは詳しく触れませんが。
ActionScript では、変数や関数、ムービークリップ・ボタンなどのインスタンスには全て、持ち主がいるものと考えます。
今回の件ですと、テキストファイルから読み込んだ w01 ~ w03 の変数はムービークリップ g01 のもの、g01 と ao ・ aka のムービークリップはメインのタイムライン(通常は _root という名前のムービークリップ)のものです。
変数や関数を利用したりインスタンスに指示を出す時は、誰が持っているものなのかを正確に指定しなければなりません。
持ち主の指定を”ターゲットパス”といい、様々な書き方があります。
ターゲットパスを誤ると内容を参照できなかったり、インスタンスに指示が伝わらなくなったりします。
ActionScript では大切な考え方ですので、解説書や解説サイトで調べてみてください。

それから、FlashPlayer 6 以降では、loadVariables よりも高機能な” LoadVars ”というクラス( Flash MX ではオブジェクト)を使って読み込むこともできます。
機会がありましたら、こちらでの読み込みも研究してみてください。
    • good
    • 0
この回答へのお礼

DPEさん本当にどうもありがとうございます。
解りやすくとても丁寧にご説明下さってありがとうございました。
おかげ様で作りたいものも出来上がりました。
これからたくさん勉強してスキルアップしたいと思います。
本当にありがとうございました。

お礼日時:2009/01/08 19:59

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