AS3 Flash 外部テキストのロードと変数の扱い方

このQ&Aのポイント
  • AS3 Flashで外部テキストをロードして変数に代入する方法について教えてください。
  • イベントハンドラで数値を取得し、別の変数に代入して保持させたいのですがうまく行きません。
  • 外部ASファイルのカスタムクラスのプロパティに代入しても値が保持されません。解決方法を教えてください。
回答を見る
  • ベストアンサー

AS3 Flash 変数の扱い方について

質問なんですが、外部テキストをロードして完了したら イベントハンドラで数値の5を取得し、 それを別の変数に代入して保持させようと思い、 外部ASファイルのカスタムクラスのプロパティに代入したんですが上手く行きませんでした。 なのでどのようにしたら良いのか教えて頂けませんか? プログラムは以下になります。ではよろしくお願いします。 ***ASファイル*** package{ public class ImageRoadClass{ public static var number:int; // 返り値保持 private var number2:int; // 返り値保持 function ImageRoadClass(){ } public function setNumber(number:int):void{ this.number2 = number; } public function getNumber():int{ return this.number2; } } } ***flaファイル*** // インスタンス生成 var imageRoad:ImageRoadClass = new ImageRoadClass();        ・ (割愛)  ・        ・ // ロード完了後のイベントハンドラ function jsonReadHandler(e:Event):void{ var json_data:String = URLLoader(e.currentTarget).data; // 読み込んだテキストをjsonオブジェクトにデコード var json_decode_data:Object = JSON.parse(json_data);       // ***ここで値を外部クラスのプロパティに代入*** ImageRoadClass.number = json_decode_data[0].number; imageRoad.setNumber(json_decode_data[0].number); trace(ImageRoadClass.number); // 出力結果:5 trace(imageRoad.getNumber()); // 出力結果:5 } trace(ImageRoadClass.number); // 出力結果:0  保持できてない trace(imageRoad.getNumber()); // 出力結果:0  保持できてない

  • Flash
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1です。 > var urlLoader:URLLoader = new URLLoader(); > urlLoader.dataFormat = URLLoaderDataFormat.TEXT; > urlLoader.addEventListener(Event.COMPLETE, jsonReadHandler); > urlLoader.load(new URLRequest("json_data.json") ); > > が記述されています。 > なので、コンプリートしてから > イベントハンドラが呼び出されているはずなんですが、 > カスタムクラスのプロパティには保存されてませんでした。 だから..., #1で書いた意味が全くわかってらっしゃいませんね。。。 > カスタムクラスのプロパティには保存されてませんでした。 と書かれていますが それを確かめているタイミングが urlLoader に データのロードが完了する前なんですって! データのロードが完了する前に(まだデータを見ることができる状態になっていない段階で) > trace(ImageRoadClass.number); // 出力結果:0  保持できてない > trace(imageRoad.getNumber()); // 出力結果:0  保持できてない など確かめても データは入っていないのは当然でしょう? それだけのことを理解できれば 対処法はどうにでもなると思いますよ。 ということです。 (逆に言えばそれだけのことを理解しなければ何もできません。) 例えば すでに用意されている関数 function jsonReadHandler(e:Event):void{…} の中で 別関数(例:testFunc) を実行させるようにして その 別関数(例:testFunc) 内で カスタムクラスのプロパティに値が保存さてれいるかどうかを確かめてみれば良いのではないでしょうか?

with_nature
質問者

お礼

回答ありがとうございます。 確かにtestFuncで試してみると値が保存されていました! おっしゃる通り、asファイルのプロパティに値が保存される前に出力してたってことだったんですね。何か大きな勘違いをしていたみたいです。 ただなんで最後に書いた出力文が最初に実行されているのかが良くわかりませんが、これはまた違う内容の質問になってしまうので、また改めて質問したいと思います!もし都合があえばこの疑問にも答えてくれると助かります! ではありがとうございました。

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

最後の trace(ImageRoadClass.number); // 出力結果:0  保持できてない trace(imageRoad.getNumber()); // 出力結果:0  保持できてない 「この2行のスクリプトが実行されたときに まだ外部データのロードが終わっていない。」 ただそれだけのことだと思いますよ。 つまり,時間差(実行タイミング)の問題です。 スクリプトには jsonReadHandler をロード完了時に実行させるように addEventListener する部分が抜けていますが 実際にはその部分が含まれているのでしょう? だからこそロード完了時に jsonReadHandler が実行されているのだと思います。 何のためにそのようなことを自分自身でしているのかを考えてみれば 答えはわかると思います。 方法など無数にあります。 とにかく当たり前のことですが データをロードしない限り データを見ることはできないのです。 また 読み込んでいないデータを変数に代入するなんてことも当然できないのです。 それだけのことです。

with_nature
質問者

補足

回答ありがとうございます。 説明不足で申し訳ないんですが、イベントハンドラの前に var urlLoader:URLLoader = new URLLoader(); urlLoader.dataFormat = URLLoaderDataFormat.TEXT; urlLoader.addEventListener(Event.COMPLETE, jsonReadHandler); urlLoader.load(new URLRequest("json_data.json") ); が記述されています。なので、コンプリートしてからイベントハンドラが呼び出されているはずなんですが、カスタムクラスのプロパティには保存されてませんでした。

関連するQ&A

  • AS3 asファイルでイベントリスナが登録できない

    外部(as)ファイルに以下のようなメソッドを記述していたんですが // ***** エラー行 ***** とコメントアウトしている場所で、『型が見つからないか、コンパイル時定数ではありません。:Event。』というエラーが出てしまいます。 外部ファイルではイベントリスナは登録できないのでしょうか? 良かったら回答の方、よろしくお願いします。 public function jsonRead(){ var urlLoader:URLLoader = new URLLoader(); urlLoader.dataFormat = URLLoaderDataFormat.TEXT; urlLoader.addEventListener(Event.COMPLETE, jsonReadHandler); urlLoader.load(new URLRequest("json_text.json") ); function jsonReadHandler(e:Event):void{ // ***** エラー行 ***** var json_data:String = URLLoader(e.currentTarget).data; // ターゲットからテキストデータを取得して変数に代入 var json_decode_data:Object = JSON.parse(json_data); // 読み込んだテキストをjsonオブジェクトにデコード this.pages_of_book = Number(json_decode_data[0].number); trace(this.pages_of_book); } // jsonReadHandler() } // jsonRead()

    • ベストアンサー
    • Flash
  • as2.0で親の変数を得たいのですが。

    as2.0で親の変数を得たいのですが。 #base/Aaa.as import base.*; class Aaa{ private var myBbb: Bbb; public var myValue: Number; public function Aaa(arg1: Bbb, arg2: Number){ myBbb = arg1; myValue = arg2; } public function getBbb(): Bbb{ return myBbb; } } #base/Bbb.as import base.*; class Bbb{ public function Bbb(){} public function display(): Number{ -----ここでAaa.myValueを返す----- } } #main.fla import base.*; var myBbb = new Bbb(); var myAaa = new Aaa(myBbb, 10); trace(myBbb.display());//=> 10と表示したい 上のようにするにはどうすればよいのでしょうか。 基本的なことかもしれませんが、調べても出てきませんでした。

    • ベストアンサー
    • Flash
  • as3 変数のスコープについて

    xmlの読み込みをしていますが、 最後のtraceで内容が表示されません。nullになります。 var myXML:XML; var imgSrc:String ; var url:URLRequest = new URLRequest("test.xml"); var xmlLoader:URLLoader = new URLLoader(); xmlLoader.dataFormat = URLLoaderDataFormat.TEXT; xmlLoader.load(url); xmlLoader.addEventListener(Event.COMPLETE, comp); function comp(event:Event):void { myXML = XML(xmlLoader.data); imgSrc = myXML.img[0]; } trace(imgSrc);←ここがnullです。 function内でtraceすると問題なく表示されるのですが、 一体どうしてでしょうか。 ご教授お願いいたします。

    • ベストアンサー
    • Flash
  • アノテーションを利用したアクセサメソッドの自動定義というのは実現可能?

    近年、デフォルトコンストラクタと各フィールドに対するアクセサメソッド(setter/getter)を備えたJavaBeansが話題になっていると思います。例えばこんなクラス。 class TestBeans {  private int number;  public void setNumber(int number) {   this.number = number;  }  public int getNumber() {   return number;  } } しかし、フィールドの数が増えてくると、コードがどんどん冗長になってくると思います。 そこで、ふと思ったのですが、リフレクションとJDK5のアノテーションを使って、下記のようにスッキリとアクセサメソッドが利用できるようになったりしないかなぁ、と。 class TestBeans {  @Getter @Setter  private int number; } こうすることによって、getNumber / setNumber が利用できるようになったりしないかな、ということです。 アノテーションの自作やリフレクションに関する知識が乏しいので、私にはよくわかりませんでした。 こういったことは実現可能なのでしょうか? また可能ならばどのように実装するのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 【AS3.0 変数をPHPにPOSTする方法】

    【AS3.0 変数をPHPにPOSTする方法】 開発環境:WinXP ADOBE CS4 ActionScript3.0 すいません。教えてください。 Flashで得た複数の値を外部ファイルに出力したいと考えています。 例えば、btnA・btnB・btnCという3つのボタンがあり、 ボタンをクリックすると、クリック数がカウンターになり、 その値をPHPファイルにPostしたいと考えています。 現在のソース(btnAのみ) ---------------------------------------------------------------- var req:URLRequest = new URLRequest ("http:++++++.php"); req.method = URLRequestMethod.POST; var variables:URLVariables = new URLVariables(); //送信パラメータ variables.num01 = 0; req.data = variables; var loader:URLLoader = new URLLoader (req); var are01=0 var num01=0 a_btn.addEventListener(MouseEvent.CLICK,aClick); function aClick(event:MouseEvent):void{ var num01=are01++ trace(num01) var printdata:URLVariables = new URLVariables(event.target.data); loader.load(req); } -------------------------------------------------------------- num01の数値がトレースはされているのですが、 phpの値に代入されません。 --------------------------------------------------------------- phpソース $comment = $_POST['num01']; print "rData=" . $comment;</body> ---------------------------------------------------------------- 同時に複数の値・仮にnum02・num03も同様にPHPにPOSTしたいと考えているのですが、 その際の方法がわかりません。 恐れ入りますが、ヒントだけでもよいので教えていただけないでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 重複しない乱数を作り配列に入れる(AS3.0)

    Flash Pro CS5 AS3.0 で記述しています。 1~10の整数をランダムかつ重複せずに配列に格納したいと考えています。 そこで,ネット上で参考になるソースを見つけ, 以下のように書き直しました。 var int_a = new Array(); var int_b = new Array(); function RandomInt():void{ //ここだけ変更すればよい var maxN:Number = 10;//乱数の最大値 //0~maxNの数字を全部配列に入れる for (var i:int=0; i< maxN; i++) { int_a[i] = i+1; } var j:Number = 0; var a_length:Number = int_a.length; //要は配列をシャッフルする while (a_length) { var int_r:Number = Math.floor(Math.random()*(maxN+1-j)); //乱発生した整数を配列int_bに順番に入れ、int_aから削除する int_b[j] = int_a.splice(int_r, 1); j++; //配列int_a内の数字が一つずつ減っていく a_length = int_a.length; } //ここで配列int_bがシャッフルされた trace(int_b); } RandomInt(); としました。 しかし出力結果がなぜか 8,2,4,9,,7,6,5,10,3,1のように抜けている部分があり, 次のフレームで for(var j:int=1; j <= 10; j++){   trace(int_b[j]); } として確認してもやはり 2 4 9 7 6 5 10 3 1 となってしまします。 どの部分がおかしいのか教えていただきたいです。 また,乱数発生の部分で Math.floor(Math.random()*(maxN+1-j)); という風に記述してあったのですが,ここは間違いではないのでしょうか? jを引いていくと発生する乱数の範囲が徐々に狭くなっていってしまうと思ったのですが; それとも元のソースコードを使って ttp://www.renowan.com/blog/?p=143 0~9までの乱数を発生させてそれぞれに1を足す方が簡単でしょうか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • $.getJSONにJSON.stringifyを

    $.getJSONに、JSON.stringifyした結果を指定したいのですが、どうすればよいでしょうか? ■現状 ・コンソールにJSONは出力されているのですが、$.getJSONでこのファイルを指定しても、画面真っ白です ▼index.html <script type="text/javascript" src="hoge.json"></script> <script type="text/javascript"> $.getJSON('hoge.json', function(data) { ▼hoge.json var obj =([ [略], ]); var json_text = JSON.stringify(obj); // テスト出力 console.log(json_text); ■質問 ・$.getJSONにこの出力結果(json_text)を指定するためには、どうすれば良いでしょうか? ・一旦ファイル出力しなければいけないのでしょうか? ・どうやるのでしょうか? ・AJAXでサーバ側へデータを渡してファイル出力した後、$.getJSONでその出力したファイルを指定するしかない?

  • 外部テキストの値を得るには?

    フラッシュ初心者&質問するのが初めてなので うまく伝わるかどうか心配ですがよろしくお願いいたします。 外部テキストnum.txtにはstr=5という記述があります。 このnum.txtを取り込んで、 5という数値をflash側で変数aaaに代入しました。 --------------------------- var vars = new LoadVars(); vars.load("num.txt"); vars.onLoad = function(num){ if(num){ aaa= vars.str; trace(aaa); } } --------------------------- この場合、ちゃんと5と出力されます。 しかしこの関数内のaaaという変数を他でも利用したいのです。 (例えばvar menu_num:Number = aaa;というように) 単純に下のように記述すると --------------------------- var vars = new LoadVars(); vars.load("num.txt"); vars.onLoad = function(num){ if(num){ aaa= vars.str; } } var menu_num:Number = aaa; trace(menu_num); --------------------------- undefinedが出力されます。 この時にちゃんと5と出力させるにはどうしたらいいのでしょうか。 いろいろグローバル変数など勉強しましたがうまくいきません。 ちなみに外部テキストnum.txtのstr=5というのは、 5という数字のみでもかまいません。 とにかくテキストから数値を取り出す方法を考えています。 ご回答お願いいたします。

    • ベストアンサー
    • Flash
  • flashアクションスクリプト LoadVarsについて

    はじめまして。初めて質問させていただきます。 onloadメソッドの中でロードしたデータを変数に代入したいのですが、うまくいきません。記述は以下のとおりです。 var hen; a_lv=new LoadVars(); a_lv.onLoad=function(a){ hen=this.txt } a_lv.load("b.txt"); trace(hen); 出力パネルに”undefined”と表示されてしまいます。 どうしたらうまくいきますか? 分る方いましたら、是非教えてください。

  • actionscript クラスのメンバ変数のアクセスについて

    やりたいことは、 ムービークリップ(move_mc)をある座標まで、 減算処理をしながら移動するということなんですが、 クラスを勉強中で下記のように書いてみました。 ■インスタンス生成&メソッドへアクセス var move1:Move = new Move(5,100); move1.onclick(); ■asファイル class Move{ var speedPro:Number; var rangePro:Number; function Move(speed:Number,range:Number){ this.speedPro = speed; this.rangePro = range; trace(this.speedPro);//ここの値は5がでます } public function moving(){ _root.move_mc.onEnterFrame = function(){ this._x += (this.rangePro - this._x)/this.speedPro; trace(this._x); trace(rangePro);//undefined trace(this.speedPro);//undefined } } public function onclick(){ _root.move_mc.onRelease = moving; } } speedとrangeでスピードの値と移動範囲の値を引数で渡しています。 コンストラクタ関数のところでtraceするとちゃんと値はわたっていますが、moving関数のところではちゃんと値を取れていないようです。 メンバ変数にちゃんととりにいけていないようなのですが、 どのような書き方をしたらとりにいけるのでしょうか。。。 また、根本的にこのような書き方であっているのでしょうか。。。 ご協力お願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう