- ベストアンサー
AS2.0、Flash8でfor文またはwhileなど使用して処理したい
- AS2.0、Flash8でfor文またはwhileなどを使用して、データを処理する方法について質問があります。
- XML内に用意した3つのカテゴリのノードを読み取り、条件に応じて表示する処理をする関数を作成したいです。
- デフォルトでは1つ目のカテゴリを表示し、存在しない場合は2つ目、3つ目のカテゴリを順番に表示する仕組みを作りたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 1カテゴリ目が無い場合 この状態がどういう状態であるのかがわかりません。 この状態によってスクリプトはまるで変わります。 ・1カテゴリ目が無い場合(1) <myData> <myCat2> <myParam1>パラメータ1</myParam1> ~ 以下略 ~ ・1カテゴリ目が無い場合(2) <myData> <myCat1> </myCat1> <myCat2> <myParam1>パラメータ1</myParam1> ~ 以下略 ~ ・1カテゴリ目が無い場合(3) <myData> <myCat1> <myParam1></myParam1> <myParam2></myParam2> </myCat1> <myCat2> <myParam1>パラメータ1</myParam1> ~ 以下略 ~ > 1カテゴリ目を表示 表示? これもどういうことか意味がわかりません。 スクリプトらしきものでは, return num; で数が返ることになっています。 「表示」 の意味もわかりませんが, 仮に trace することを 「表示」 することとして, num を 「表示」 するとするなら 「数 が 表示」 されます。 for または while にする前の前提がさっぱりわからないので何とも書きようがありません。 せめて for または while を使用しない状態で動くちゃんとしたスクリプトを提示してもらえると回答もしやすいですが...。 /*/*/*/*/*/*/*/*/*/*/*/*/*/*/* ◎勝手に 「1カテゴリ目が無い場合」 の意味を次のような意味とします。 ・1カテゴリ目が無い場合(2) <myData> <myCat1> </myCat1> <myCat2> <myParam1>パラメータ1</myParam1> ~ 以下略 ~ これの正確にな意味はカテゴリがないのではなくて, カテゴリはあるのだけどその子ノードがないという意味になります。 ◎勝手に 「表示する」 とは 「trace出力する」 という意味とします。 ◎勝手に XMLは外部XMLファイルであって, さらに勝手に文字コードはUTF-8で, さらに勝手にSWFなどと同階層にある「data.xml」だとします。 ◎勝手に外部XMLファイルのデータ内容は次のようなものであるとします。 ------------------------------- <myData> <myCat1> </myCat1> <myCat2> <myParam1>パラメータ21</myParam1> <myParam2>パラメータ22</myParam2> </myCat2> <myCat3> <myParam1>パラメータ31</myParam1> <myParam2>パラメータ32</myParam2> </myCat3> </myData> ------------------------------- また,各カテゴリのパラメータは <myParam1>パラメータ21</myParam1> のようになっているかもしれないし <myParam1>パラメータ21</myParam1> <myParam2>パラメータ22</myParam2> のようになっているかもしれないし <myParam1>パラメータ21</myParam1> <myParam2>パラメータ22</myParam2> <myParam3>パラメータ23</myParam3> のようになっているかもしれないという ノード数が不特定である条件だとします。 上の4つの◎の勝手な条件であった場合, スクリプト全文は次のようにするのが1つの方法です。 あくまでも1つの方法例です。 ------------------------------------------- // XML を文字コード UTF-8 としてロードする設定 System.useCodepage = false; // XMLクラスのインスタンス myXML を作成 var myXML:XML = new XML(); // XMLの余分な改行や空白を削除 myXML.ignoreWhite = true; // XML ロード時の動作を定義 myXML.onLoad = function(Seikou:Boolean):Void { // ロードに成功すれば if (Seikou) { // ★ユーザ定義関数 dataCHK の戻り値を出力 trace(dataCHK()); } else { trace("ロード失敗"); } }; // 外部 XML ファイル 「data.xml」 をロード myXML.load("data.xml"); // ★ユーザ定義関数 dataCHK の定義 :戻り値は配列 function dataCHK():Array { // myXML.firstChild ノードを「myNode」とする var myNode:XMLNode = myXML.firstChild; // myNode のノード数分ループ for (var i:Number = 0; i<myNode.childNodes.length; i++) { // もしmyNodeの子がさらに子ノードを持っていれば if (myNode.childNodes[i].hasChildNodes()) { // 配列 myArray を作成 var myArray:Array = new Array(); // 配列の要素0に i+1 を代入 myArray[0] = i+1; // myNodeのさらに子のノード数分ループ for (var j:Number = 0; j<myNode.childNodes[i].childNodes.length; j++) { // 配列の要素1以降にそのノードの値を代入 myArray[j+1] = myNode.childNodes[i].childNodes[j].firstChild.nodeValue; } // 配列 myArray を返す & function終了 return (myArray); } } } ------------------------------------------- ・ActionScript2.0 ・FlashMX2004以上(Flash8も含む)で使用可能 ・要 FlashPlayer6 以上のSWFパブリッシュ 「制御」→「ムービープレビュー」で動作確認できます。 勝手に,「パラメータのノード数は不特定である」としたため, for文は for (i=0; i<○○; i++) { for (j=0; j<○○; j++) { //~動作~ } ; } ; という i , j 二重ループにしています。 for文などを使と,繰り返しを短縮できるというメリットがあります。 そして,もっぱらこのメリット方が重要のように書かれているもの(本やサイト)が多いです。 しかし,むしろ私はそんなことはどうでも良くて, 不特定回数ループできるということの方が重要なメリットだと思います。 上のようにしておくと, カテゴリ数がいくつあっても,また,その中にパラメータ数がいくつあっても, それは関係なしに同じスクリプトで使用できます。 (上のスクリプトでも カテゴリ数=3 や パラメータ=2 という指定は一切入れていません。)
その他の回答 (1)
- SAYKA
- ベストアンサー率34% (944/2776)
気持ちは分かるんだけれど まずforまたはwhileにしてみたものも載せてほしいかな。 その上でどう変な動きになるのか教えて欲しい。 多分、「配列」の使い方を知る必要があるんじゃないかな。 質問文のソースからすると。
お礼
何とかこねくり回した結果、動いてくれたので以下にスクリプトを記述します。 情報不足なようで、もう少し具体的に説明します。 YOUTUBEのようなFlash FLV動画プレイヤーを作ってます。 動画とそのタイトル、動画のプレイリスト、などがありそれをXMLで管理してます。 カテゴリとはつまり動画のカテゴリです。 スクリプトはroot第1フレで実行するもので、 デフォルトではカテゴリ1が選択、で、カテゴリ1ボタンが選択状態となり、動画のプレイリストにカテゴリ1の動画がリストアップされます。 カテゴリ1が無ければカテゴリ2が初期選択状態となります。 1も2も無ければ3が初期選択状態です。カテゴリ1があれば必ず1が初期選択状態です。 この『無ければ』とは… <myData> <myCat1> <!-- 空っぽ --> </myCat1> <myCat2> <myVideoData> <param1>xxx.flv</param1> <param2>タイトル</param2> <param3>説明文</param3> <myVideoData> </myCat2> ・ ・ </myData> といった感じです。 以下がスクリプトです。実際はカテゴリが5つです。 function chkCat():Number { // カテゴリトータル var catTotal:Number = 5; // カテゴリ1を選択、無い場合は次カテゴリへ n = 1; while (_root["dataList"+n] == undefined) { n++; } // 初期選択となるカテゴリリストを決定、totalNodeへ入れる totalNode == _root["dataList"+n]; for(i:Number = 1; i <= catTotal; i++) { var myDataList:Array = _root["dataList"+i]; // 動画リストが無いボタンはすべて押せない if(myDataList.length == undefined) { _root["btn_cat"+i].enabled = false; _root["btn_cat"+i]._alpha = 60; } } // 初期選択される動画リストのナンバーを返す return n; } thumbLoad(n); // 動画リストを表示する関数 selectCat(n); // ボタン選択状態をコントロールする関数 補足: XMLはCASAでパースしてまして、 dataList1 = XmlUtil.xmlToObject(this.myXmlLoad.getXml())['node'][0]['node'][0]['node']; ・ ・ といった具合で5種類。 もっと良い書き方があるよ!とかそんなんへぼへぼ!的な意見があれば是非ご教授ください!!
お礼
ありがとうございます! 大変細かく説明して頂いて本当に感謝です。 まだちゃんと試せていませんが取り急ぎ御礼をさせていただきます。 「SAYKA」さんへのお返事で解決したスクリプトを記述しました。 恐れ入りますがそちらもご覧頂き、そのスクリプトがもっと最適化できないものか、 あるいはもっとシンプルになるのか、それとももう十分なのか、 そういった観点でまたご意見いただけると幸いです。