XMLから画像URLを呼び込むソースの仕組みと解説

このQ&Aのポイント
  • このソースではXMLから画像URLを呼び込む仕組みについて解説します。
  • まず、XMLデータをロードし、ノードのトータル数を取得します。
  • カウント用変数を使って、画像を順番に表示し、クリックするとリンク先に移動します。
回答を見る
  • ベストアンサー

このソースで、仕組みについて教えてください。

現在、スクリプトを勉強しているんですが、XMLから画像URLを呼び込むソースで調べ方が分からない箇所がありますので、どなたか解説して頂けないでしょうか? ●下記はどういった式になるのでしょうか? _root.total = this.childNodes[0].childNodes.length; ※totalの時 = このチルドノード[0]の子ノードを調べる? (自分の解釈です。この[0]はなんなのでしょうか?) ●例えばトータルの最後尾から逆再生させるにはどんな式が必要でしょうか? ※mainasu = cnt-1; (間違ってるとはおもいますが、内容をまだ反映できないので確認ができません) ●初期値 // ストップ stop(); // カウント用変数 cnt の初期値を設定 cnt = -1; // XMLインスタンスの作成 myXML = new XML(); // 余分な空白などを削除 myXML.ignoreWhite = true; // XMLデータロード時の動作定義 myXML.onLoad = function() { // 変数 total にノードのトータル数を取得 _root.total = this.childNodes[0].childNodes.length; // フレーム2でストップ _root.gotoAndStop(2); }; // 外部 XML ファイルのロード myXML.load("my_data.xml"); ●2フレーム // カウント用変数がノード数-1より小さいとき if (cnt<total-1) { // カウントを 1 加算 cnt++; } else { // それ以外は 0 に戻す cnt = 0; } // テキストフィールド 「number_txt」に 番号を表示 _root.number_txt.text = myXML.childNodes[0].childNodes[cnt].firstChild.nodeValue; // MovieClipLoaderクラスのインスタンスを作成 myMCL = new MovieClipLoader(); // ロード監視用のインスタンスを作成 myObj = new Object(); // JPEG ロード完了時 myObj.onLoadInit = function(target_mc) { // load_mc にリンクを設定 target_mc.onRelease = function() { getURL(myXML.childNodes[0].childNodes[cnt].attributes.linkURL, "_blank"); }; // 再生開始 _root.play(); }; // myMCL のリスナーとして myObj を登録 myMCL.addListener(myObj); // JPEG をロード myMCL.loadClip(myXML.childNodes[0].childNodes[cnt].attributes.jpegURL, load_mc);

  • egtomo
  • お礼率59% (101/170)
  • Flash
  • 回答数1
  • ありがとう数4

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

XML は階層を構築して記述できる言語で、XML の階層構造によってスクリプトも変わってきます。 スクリプトから察するに、想定している XML は  <Menu>   <Item jpegURL="image1.jpg" linkURL="http://○○○.jp">1</Item>   <Item jpegURL="image2.jpg" linkURL="http://△△△.jp">2</Item>   <Item jpegURL="image3.jpg" linkURL="http://□□□.jp">3</Item>  </Menu> ↑タグの名前はさておき、このような構造ではないでしょうか? ActionScript 2.0 までの XML は、XML オブジェクトの中に様々な変数が作られ、取得した値は前後のノードの情報を参照するための手掛かりなどと一緒に記録されます。 先述の XML の構造ですと、読み込みを担当した myXML には、<Menu> という子ノードが1つあります。 子ノードの情報は childNodes という名前の配列変数で記録されます。 この場合の this は myXML のことですから、this.childNodes[0] は、myXML が持っている最初の子(配列変数は0番から始まるので、0番目の子)との意味で、最も外側にある <Menu> ノードを表します。 myXML が持つノードは <Menu> ノード1つだけで、childNodes も 0 番までしかありません。 肝心の画像やリンク先などの情報は全て、<Menu> ノードの子になっています。 this.childNodes[0] が <Menu> ノードのことですから、その階層の childNodes[ 番号 ] で、<Menu> ノードが持っているそれぞれの子ノードの情報を見ることができます。 こちらも同様に、各ノードの情報が配列変数で記録されています。0番に1、1番に2、2番に3の情報が入っています。 この配列変数の 0 ~ 2 という管理番号を変数 cnt で管理し、画像や URL の情報を取り出すわけです。 ***** その、変数 cnt ですが。 上記の例ですと、<Menu> の子ノードは3つですから、その情報を持つ配列変数 this.childNodes[0].childNodes も要素が3つ、番号にして 0 ~ 2 まであります。 従って、cnt が取りうる値も 0 ~ 2 となります。 childNodes は配列変数なので、length というプロパティを見ると配列変数の中に要素がいくつあるのかが分かります。今回の例では3つですから、childNodes.length は 3 です。 ご提示のスクリプトでは、この length の値を変数 total に記録しています。 cnt の最大値は 2 、これはつまり total - 1 (= length - 1 )です。 cnt が total - 1 未満の時は次のノードがあるので cnt を +1 して次のノードの情報を見ることができますが、cnt が 2 の時は次のノードがありません。 そこで、if 文を使って 2 の時は 0 に戻すことで、0 ~ 2 の間に収まるようにしているのです。 配列変数は管理番号が 0 から始まり、length には管理番号の最大値 + 1 が記録されるという特徴があります。 この点を利用して、剰余を使って if 文を使わずに計算する方法もあります。 total(=length )の値である 3 の剰余は、cnt の値が何であれ、必ず 0 ~ 2 のいずれかになります。 つまり、cnt を +1 した後で total の剰余を求めたものを cnt の新しい値にしておくと、if 文で判断しなくても 0 ~ 2 のカウントアップ( 2 の次は 0 に戻る)になります。 スクリプトにしますと、  _root.cnt = ( ++_root.cnt ) % _root.total; このようになります。剰余は % 演算子で求められます。 後ろから求める場合も、同様に剰余を利用することができます。 cnt が 0 の時に -1 すると剰余が負の数になってしまいますから、-1 したあとで total の値を加算して正の数に戻し、改めて total の剰余を求めます。これで、2 ~ 0 のカウントダウン( 0 の次は 2 )になります。 スクリプトは  _root.cnt = ( ( --_root.cnt ) + _root.total ) % _root.total; このようになります。

関連するQ&A

  • xmlから作ったサムネールを移動させる

    こんにちは。 flashを勉強中です。XMLからサムネールの一覧を作ろうとして、 なんとかステージに配置するのはできたのですが、サムネールの 数が多いので、マウスの位置によって垂直に移動させる様なことを したいのですが、どうして動かせばよいのかがわからずに困って おります。 アクションスクリプトは以下の様にしております。 このサムネールをMCに埋め込む方法だけでもお教え頂ければ 幸いです。よろしくお願いします。 ----------------------------------------------- myXML = new XML (); myXML.ignoreWhite = true; myXML.load ("data.xml"); myXML.onLoad = function (loaded) {    if (loaded) {      v_rootNode = myXML.firstChild;      v_num = v_rootNode.childNodes.length;      _root.total = v_num;      v_currentPhoto = v_rootNode.firstChild;      v_currentNumber = 0;       for (i=0; i < v_num; i++) {        duplicateMovieClip (icon , "mc_icon"+i, i+1);        path = v_currentPhoto.childNodes[1].firstChild;         _root["mc_icon"+i]._x = 30;         _root["mc_icon"+i]._y = 65 * i + 30;         _root["mc_icon"+i].picture.LoadMovie(path);         _root["mc_icon"+i].title = v_currentPhoto.childNodes[0].firstChild;        v_currentPhoto = v_currentPhoto.nextSibling;        }     } else {      trace ("error occured");   } };

    • ベストアンサー
    • Flash
  • onload時の変数の有効範囲について

    こんばんは。よろしくお願いいたします。 AS2,以下のスクリプトについて import mx.xpath.XPathAPI; abc=new Array(); myXML= new XML(); myXML.ignoreWhite = true; myXML.onLoad =function (){ var XPathString:String = "/data/abc/*"; //条件を満たすノードを配列に格納 abc = XPathAPI.selectNodeList(this.firstChild, XPathString); textarea1.text=abc[0]; //(1) } myXML.load("data.xml"); textarea2.text=abc[0]; //(2) 条件を満たすノードを配列abcに格納したいのですが、(1)のabcには対象の ノードが格納されるのに対して、(2)のabcには何も格納されていません。 (2)のabcでも対象のノードを格納するにはどのようにしたらよいのでしょうか?

    • ベストアンサー
    • Flash
  • 配列での管理について

    外部JPGファイル名が記述してあるXMLファイルを読み込んで,サムネイルインスタンスを生成したいと思います。 構想としては 1、読み込んだXMLファイルのノードの数(変数名:menu_num)を参照。 2、ノード数の分attachMovieメソッドでシンボル(識別子:thum-menu)の生成を繰り返す 3、生成したシンボルに含まれるムービークリップインスタンス(インスタンス名:jpg_mc)にloadMovieメソッドで外部JPGをロードする 途中まで作ったフレームアクションが下記の通りです。 // 1 System.useCodepage = true; var obj_xml:XML = new XML(); obj_xml.ignoreWhite = true; obj_xml.load("sample.xml"); obj_xml.onLoad = start_me; function start_me(success:Boolean):Void {    if (success == true) {    var nodeList:Array = obj_xml.firstChild.childNodes;    var menu_num:Number = nodeList.length; // 2. インスタンスの生成と設定   for (var i:Number = 1; i<=menu_num; i++) {    var menu_str:String = "thum-menu0"+i;     _root.attachMovie("thum-menu", menu_str, i);    trace(i); これ以降(行程2)で生成した複数のシンボルを配列で管理したいのですが、なかなかうまくいきません。どなたかおしえていただければ幸いです。 ちなみにXMLファイルのノード数の取得はちゃんとできてるようです。 使用ソフトは Flash 8 で ActionScript2.0 です。

  • ニュースティッカーを作る

    初めて質問させていただきます。 外部xmlを読み込んでニュースティッカーを作りたいのです。 ・タイトルが右から流れてある時点でストップ、そして左へ消えていく。 ・タイトルにその記事へのリンクを貼る。 タイトルを表示させることは出来たのですが、動きとリンクを貼ることができません。 WinXP,FlashMX で作業をしております。 どなたか教えていただけないでしょうか? よろしくお願い致します。 ・外部xmlファイル test.xml <?xml version="1.0" encoding="Shift_JIS" ?> - <story> - <item> <title>NEWSその1</title> <description>記事の内容</description> <link>http://www.news01.com</link> </item> - <item> <title>NEWSその2</title> <description>記事の内容</description> <link>http://www.news02.com</link> </item> - <item> <title>NEWSその3</title> <description>記事の内容</description> <link>http://www.news03.com</link> </item> - <item> <title>NEWSその4</title> <description>記事の内容</description> <link>http://www.news04.com</link> </item> </story> ステージにダイナミックテキストを配置(インスタンス名:news_txt) ・rootの第一フレーム System.useCodepage = true; news_txt.html = true; my_xml = new XML(); my_xml.ignoreWhite = true; // 外部 XML ロード完了時の処理 my_xml.onLoad = function(success) { // ロードに成功すれば if (success) { // rootNode に my_xml.firstChild を設定 rootNode = my_xml.firstChild; // ニュースのエレメント数を取得 nodeLen = rootNode.childNodes.length; news_txt.htmlText = rootNode.childNodes[0].firstChild; myID = setInterval(changeTopic,5000); } else { trace("Error loading XML."); } }; // インスタンス my_xml に外部XML をロード my_xml.load("test.xml"); var cnt = 0; function changeTopic() { if(cnt<nodeLen-1){ cnt++; }else { cnt=0; } // news_txt.htmlText = rootNode.childNodes[cnt].firstChild; }

    • ベストアンサー
    • Flash
  • Flash ActionScript 2.0でアドバイスをお願いいたし

    Flash ActionScript 2.0でアドバイスをお願いいたします。 下記のような記述で、外部フォルダ内の画像(連番のファイル名)を読み込み表示させています。画像枚数は変動しますのでこのような形にしました。 そこで問題なのが、リンク先の指定です。 XMLを読み込んでファイル名「1」の画像にはID「1」のURLがクリックしたら開くようにしたいのですが、どのように設定すればいいのかわかりません; 素人なもので、どのように記述すれば良いかご教授いただければ幸いです。 どうぞよろしくお願いいたします。 ----------------------------- var n = 0; var s = 0; _forcusrect = false; load_mc = createEmptyMovieClip("load_mc", -1); var mcLoader:MovieClipLoader = new MovieClipLoader(); var oListener = new Object(); function searchTotal() { s++; $jpg = "img_top/p"+s+".jpg"; mcLoader.loadClip($jpg, load_mc); load_mc._alpha = 0; oListener.onLoadError = function() { total = s; clearInterval(sID); n = 0; autoExchange(); }; mcLoader.addListener(oListener); } function p_load(n) { $jpg = "img_top/p"+n+".jpg"; mcLoader.loadClip($jpg, load_mc); p_direction(n); load_mc._x = 0; load_mc._y = 0; load_mc._alpha = 0; _root.onEnterFrame = function() { load_mc._alpha += (180-load_mc._alpha)/30; current_num.text = n; total_num.text = total-1; } } function autoExchange() { if (n>=total-1) { n = 1; p_load(n); } else { n++; p_load(n); } } sID = setInterval(searchTotal, 70); pID = setInterval(autoExchange, 4000); myComboBoxListener = new Object(); myComboBoxListener.change = function() { clearInterval(pID); if (flag!==1) { pID = setInterval(autoExchange, myCombo.value*1000); } }; myCombo.addEventListener("change", myComboBoxListener); ----------------------------------------- XML ----------------------------------------- <?xml version="1.0" encoding="Shift_JIS"?> <urllist>   <anchor id="1" url="http://www.yahoo.co.jp" target="_self" /> <anchor id="2" url="http://www.google.co.jp/" target="_self" /> <anchor id="3" url="http://www.goo.ne.jp/" target="_self" /> </urllist>

    • ベストアンサー
    • Flash
  • XMLファイルの読み込みとデータの引き出し

    すみません。 徹夜しても答えがわからないのですが、 XMLからSWFの読み込みなのですが 下記スクリプトの間違いは何でしょうか? FLASH8.0 AS2 で作成してます。 //XMLファイルのXMLオブジェクトへの格納 myobjXML = new XML(); myobjXML.ignoreWhite = true; //XMLファイルの読み込み myobjXML.load("article.xml"); //XMLの情報格納 var imgNum = _root.myobjXML.childNodes[0].childNodes[0].nodeValue; if (imgNum == 1) { _root.nextbtn_mc._visible = false; _root.nextbtnlarge_mc._visible = false; } //写真数表示 this.imgnumtxt.text = imgNum; this.imgnumtxt2.text = imgNum;

  • 変数の戻り値を作りたい

    戻り値を作ってみてるのですが、うまくいきません。 画像6枚入れたとして、ボタンに on (release) { cnt = cnt-2; } を作りましたが、1枚目のマイナスの値がないため、バグります。 ※多分小数点になりSTOP そこで、ボタンを足し算で合計にしてみたら、totalを超えると0に戻される為、1枚目にしか戻りません。 ifで制御しようと、ひとまず if (cnt>total-1) { cnt=total-1; } を追加したら、最初から常に6枚目が表示されてしまいます。 なぜ cnt>total-1 の方が勝ってしまうのでしょうか? ======================================================== cnt = -1; _root.total = this.childNodes[0].childNodes.length; if (cnt<total-1) { cnt++; } else { cnt = 0; } ========================================================

    • ベストアンサー
    • Flash
  • XMLから読み込んだデータを数値に変換する方法

    こんにちは。 XMLからデータを読み取ってそのpositionの値を元に 画像を動かそうとしています。 ただ、読み込んだ数値が文字と判断されていて、 numberで変換しても、数値にならずに、動かすことが できません。 申し訳ありませんが、お教え頂ければ幸いです。 よろしくお願いします。 -----script------------------------------------------- myXML = new XML (); myXML.ignoreWhite = true; myXML.load ("data.xml"); v_positionxArray = new Array (); v_positionyArray = new Array (); myXML.onLoad = function (loaded) { if (loaded) { v_rootNode = myXML.firstChild; v_num = v_rootNode.childNodes.length; v_currentPhoto = v_rootNode.firstChild; v_currentNumber = 0; for (i=0; i < v_num; i++) { v_positionxArray.push (v_currentPhoto.childNodes[0].firstChild); v_positionyArray.push (v_currentPhoto.childNodes[1].firstChild); v_currentPhoto = v_currentPhoto.nextSibling; } } else { trace ("error occured"); } }; btn_test.onRelease = function () { if (v_currentNumber < v_num-1) { v_currentNumber+=1; picture_x = Number(v_positionxArray[v_currentNumber]); picture_y = Number(v_positionyArray[v_currentNumber]); } }; picture.onEnterFrame = function () { this._x += picture_x; this._y += picture_y; } -----xml data-------------------------------------- <data> <member> <positionx>-591</positionx> <positiony>-130.7</positiony> </member> </data>

    • ベストアンサー
    • Flash
  • [actionscript] XMLを使ってスライドショーを作成しましたが・・・

    こんにちは。 FLASHアクションスクリプト初心者です。 XMLを使ってスライドショーを作成した外部SWFを メインのSWFに読み込ませたいのですが、うまくいかなくて困っています。 構成としては、メインとなるSWFファイルがあり、 そこに外部にある各ページのSWFファイルを読み込んでいます。 現在、メインのSWFファイルに読み込ませるページAのSWFファイルを作成ました。 その外部SWFファイルには、こちらのサイト (http://www.oman3d.com/tutorials/flash/slideshow/index.php) を参考にして、XMLを使って読み込んだ画像で スライドショーを作成しました。 この外部SWFファイルをメインのSWFファイルに読み込ませたのですが、 メインSWFをパブリッシュして確認したところ、 画像スライドショーの部分が表示されませんでした。 (テキストやMCなどは表示されます。) 外部SWFのパブリッシュプレビューでは表示されています。 actionscriptは、外部SWFの一フレーム目に記述されています。 ****actionscript**** import mx.transitions.Tween; import mx.transitions.easing.*; var myShowXML = new XML(); myShowXML.ignoreWhite = true; myShowXML.load("slideshow.xml"); myShowXML.onLoad = function() { _root.myWidth = myShowXML.firstChild.attributes.width; _root.myHeight = myShowXML.firstChild.attributes.height; _root.mySpeed = myShowXML.firstChild.attributes.speed; _root.myImages = myShowXML.firstChild.childNodes; _root.myImagesNo = myImages.length; createContainer(); callImages(); }; function createContainer() { _root.createEmptyMovieClip("myContainer_mc", 1); myContainer_mc.lineStyle(5, 0x000000, 100); myContainer_mc.lineTo(_root.myWidth, 0); myContainer_mc.lineTo(_root.myWidth, _root.myHeight); myContainer_mc.lineTo(0, _root.myHeight); myContainer_mc.lineTo(0, 0); myContainer_mc._x = (Stage.width - myContainer_mc._width) / 2; myContainer_mc._y = (Stage.height - myContainer_mc._height) / 2; } function callImages() { _root.myMCL = new MovieClipLoader(); _root.myPreloader = new Object(); _root.myMCL.addListener(_root.myPreloader); _root.myClips_array = []; _root.myPreloader.onLoadComplete = function(target) { _root.myClips_array.push(target); target._alpha = 0; if (_root.myClips_array.length == _root.myImagesNo) { _root.target_mc = -1; moveSlide(); myShowInt = setInterval(moveSlide, (_root.mySpeed * 1000) + 1000); } }; for (i = 0; i < _root.myImagesNo; i++) { temp_url = _root.myImages[i].attributes.url; temp_mc = myContainer_mc.createEmptyMovieClip(i, myContainer_mc.getNextHighestDepth()); _root.myMCL.loadClip(temp_url, temp_mc); } } function moveSlide() { current_mc = _root.myClips_array[_root.target_mc]; new Tween(current_mc, "_alpha", Strong.easeOut, 100, 0, 1, true); _root.target_mc++; if (_root.target_mc >= _root.myImagesNo) { _root.target_mc = 0; } next_mc = _root.myClips_array[_root.target_mc]; new Tween(next_mc, "_alpha", Strong.easeOut, 0, 100, 1, true); } 宜しくお願いいたします!

  • Loadingの作成

    早速ですが、ローディングバーを作成中です。 MovieClipLoaderを使用 12フレーム □□ 1フレームアクション myList = new Object(); myList.onLoadProgress = function( target_mc, lopadedBytes, totalBytes ) { trace("Now Loading."+":"+loadedBytes+"/"+totalBytes); } myList.onLoadError = function(){ trace("Loadエラー"); } myList.onLoadStart = function() { trace( "load開始" ); } myList.onLoadComplete = function() { trace( "load完了" ); nextFrame(); }; var my_mcl:MovieClipLoader = new MovieClipLoader(); my_mcl.addListener( myList ); my_mcl.loadClip( "image.jpg", this.loader_mc ); stop(); 2フレームに loader_mcを配置。 問題。 一向に動作しません。。。ファイルエラーも出なければプレビューしても動作せず。あとloader_mcのサイズが0x,0yなんですが、画像サイズに自動で取得してくれるんでしょうか?この辺り、クラスがどう動いていのか不明なので良く分かりません。 環境は、XP・FLASH8です。

専門家に質問してみよう