電子書籍の厳選無料作品が豊富!

as3初心者jpncan15といいます。
xmlから配列で取得したものをfunction外で取り出したいのですがどのようにすればいいのか悩んでいます。functionを調べたり配列を調べたり頭がかなり混乱中です。
お手数ですがご教授いただけますでしょうか?

var ary:Array=new Array();
var ary_name:Array=new Array();
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("b.xml");
var xml:XML;
loader.load(request);
loader.addEventListener(Event.COMPLETE , XMLload);
function XMLload(e:Event):void
{
xml = XML(e.target.data);
num_txt.text = xml.item.length();//xml件数をテキストフィールドへ入れる
for each(var element:Object in xml.item.thumb)//配列に入れる
{ary.push(element);}
for each(var element_name:Object in xml.item.name)//配列に入れる
{ary_name.push(element_name); trace(element_name);}//出力OK
}

//function外で配列を使用したい
trace(ary[5]);
trace(ary_name[2]);

A 回答 (1件)

「言語(ActionScript)」だけを考えて解決しようとしていらっしゃいませんか?


「言語」など自体を考えても答えは出ませんよ。


問題は言語ではなく
「サーバ(またはローカルPC)のハードディスクからXMLをロードするのには時間がかかる」
「XMLをロードしてからでないとそれを読んだり操作することはできない」
というたったそれだけの(超当たり前な)ことだけですから。

音波も届いてからじゃないと耳で聞くことはできませんよね?
光も届いてからじゃないと目で見ることはできませんよね?
届いた情報について考えるのはその後ですよね?
それとまったく同じことです。

その "単純で当たり前なこと" を理解しておけば
いくつかの対処法は思いつくはずです。



//------------------------------------
~~云々(略)~~
function XMLload(e:Event):void
{
~~云々(略)~~
//別の関数 traceArr を実行
traceArr();
}

//別の関数 traceArr の定義
function traceArr():void
{
trace(ary[5]);
trace(ary_name[2]);
}
//------------------------------------

↑function XMLload から見れば
その関数外で取り出していることになりますよね?



または
メインのタイムラインを2フレームなど複数フレームにして
書かれていらっしゃるスクリプトを
例えばメインのタイムラインのフレーム1などに書いておいて
stop();
をかけておきます。
そして xmlファイル のロードが完了してから
フレーム2 に進めてます↓。

//------------------------------------
~~云々(略)~~
//このフレームで再生停止
stop();

function XMLload(e:Event):void
{
~~云々(略)~~
//次のフレームで停止
nextFrame();
}
//------------------------------------

そしてフレーム2には

//------------------------------------
trace(ary[5]);
trace(ary_name[2]);
//------------------------------------

と書いても良いですよね?
完璧に関数外です。


その他
あるムービークリップを作成しておいて
xml のロードが完了してから,
ムービークリップ内のフレームの再生を開始させて
そのムービークリップ内で

trace(MovieClip(root).ary[5]);
trace(MovieClip(root).ary_name[2]);

を実行させても良いでしょう。



とにかく最初に書いた
「サーバ(またはローカルPC)のハードディスクからXMLをロードするのには時間がかかる」
「XMLをロードしてからでないとそれを読んだり操作することはできない」
ということをとりあえずはしっかり認識して
「Event.COMPLETE という便利なものを使うことによってXMLのロード完了時に指定した関数を実行できる」
ということを理解すれば
後はどうにでもなるという感じだと思います。



昔は Event.COMPLETE みたいな便利物はなかったので
外部データのロードなどをする場合,
例えば
「フレーム1 で外部データのロード命令を出して
フレーム2 と フレーム3 をループ再生させることによって
ロードされたデータに最終データ(フッターデータ や 総文字数 などから割りだす)が入っているかどうかを確かめて
最終データが届いていたなら フレーム4 に進めてデータ処理をする」
みたいなことをしていたのですよ。

ロード待ち処理装置の自作です。
全部関数外です。


それに比べれば全自動でかなり楽なものです。
(全自動で楽になった分,単純当たり前な理屈をあまり考える必要もなくなったので,逆にわかりにくくなったかもしれませんね。)
    • good
    • 0
この回答へのお礼

BlurFiltanさん
ありがとうございます。
なかなかas2からas3の移行は難しく感じています。。

なるほど!!
XMLをまだ読込終わっていないのに出来ませんよね!
と、思いつつも具体的にはどのように書いたらいいのかご教授いただいたいくつかを自分なりに考えてみたのですがキーフレームを2つにすれば分かりやすいですね!
as2の「now loading」を思い出しました。
まだまだ勉強が必要ですが、頑張ってas3を習得したいと思っています。
本当にありがとうございました。

お礼日時:2012/04/02 22:33

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