- ベストアンサー
外部XMLからFlashに読み込んだ画像にリンクをつける方法
- 初めまして。この度初めて外部XMLをFlashに読み込むコンテンツを制作しており、最後の段階でハマっておりますため、皆様のお力をお借りできればと思い投稿させていただきました。制作環境はMac OS10.3、flashはCS3です。横スクロールメニューを作成し、表示される画像にリンクをつけたいのですが、全ての画像が同じリンク先になってしまいます。
- ActionScriptとXMLファイルの内容を記載します。XMLファイルでそれぞれの画像に対応するURLを指定していますが、getURL(this.jump)を使用してもうまくリンクが反応しません。getURL(this._parent.jump)にするなど、いくつか試してみましたが解決できません。
- 何が原因でリンクがうまく作動しないのかご教示いただきたいです。よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1 です。 > 以下のようにXMLからURL部分を読み込む変数 > jumpURLを関連付けてみましたが どこで関連付けしてあるのですか??? 意味ワカラン...../(-_-)ヽ ですよ。 #1 でも全く同じことを書きましたが, なぜ,そこだけ他のものと同じにできないのでしょうか?! ↑このシンプルな内容がなぜ伝わらないのかサッパリわかりません。 obj_array[i].num = i; obj_array[i]._x = 120*(i-1); obj_array[i]._y = 30; ↑これらと同じで ↓こうすれば良いだけでは? var jumpURL:String = obj_xml.firstChild.childNodes[i-1].lastChild.firstChild.nodeValue; obj_array[i].jump = jumpURL; こうしておいた上で, function press_me():Void { getURL(this.jump); } のようにすれば良いだけでしょう? 他に妙なことをしていなければこれでうまく行くはずですが...。 なぜ,あえて「違うことをしよう違うことをしよう」 とされているのか,全くもって理解不能ですよ。 ちなみに, ご質問のスクリプトでは配列を利用していますが,配列でなくても良いのです。 と言いますか, 配列は変数の入れ物にしているだけで,配列であること自体は関係ないのです。 「オブジェクトを参照する変数」を作って, その変数にプロパティなどを設定している。 のです。 _root のステージ上に「my_mc」という四角い塗りのムービークリップを作成し, _root のフレームに次のようなスクリプトを書いたのと意味的には同じ事です。 ------------------------------------ // _root.my_mc を参照する変数 mc を作成 var mc = _root.my_mc; // そのmc(_root.my_mc のこと)に各プロパティを設定 mc._x = 150; mc._y = 100; mc._alpha = 50; mc._rotation = 45; // そのmc(_root.my_mc のこと)クリック時の動作 mc.onRelease = function() { // this とは何? trace(this); }; ------------------------------------ 【図】↓ 配列の要素に型指定をすることはできませんから, 上のスクリプトではそれと同様,変数 mc にも型指定をせず, このように↓しています。 // _root.my_mc を参照する変数 mc を作成 var mc = _root.my_mc; しかし,変数は配列内の要素と違って型指定ができますから, この変数に型指定をするならばこのように↓なります。 // _root.my_mc を参照する変数 mc を作成 var mc:MovieClip = _root.my_mc; 変数 mc とは ムービークリップ への参照を格納した変数です。 配列の要素 obj_array[i] も ムービークリップ への参照を格納した変数です。 =========================================== もっとシンプルにした次のようなものを作ってみましたが,難無く動作しましたよ。 ◎ ファイル構造 任意のフォルダ ├○○.fla (○○.swf をパブリッシュ) ├○○.swf ├scrollslide.xml └images(フォルダ) └fla(フォルダ) └image1.jpg ◎ 「scrollslide.xml」 (文字コードShift-JIS) <jpeg> <jumpURL> <jpegURL>images/fla/image1.jpg</jpegURL> <URL>Http://Www.yahoo.co.jp</URL> </jumpURL> </jpeg> ◎ 「○○.fla」 ・ライブラリ リンケージ識別子 menu (ムービークリップ) └jpg_mc(ムービークリップ) ・フレーム1 のスクリプト --------------------------------------- var obj_array:Array = new Array(); System.useCodepage = true; var obj_xml:XML = new XML(); obj_xml.onLoad = start_me; obj_xml.ignoreWhite = true; obj_xml.load("scrollslide.xml"); function start_me(success:Boolean):Void { if (success == true) { for (var i = 1; i<=1; i++) { var menu_str:String = "menu"+i; _root.attachMovie("menu", menu_str, i); obj_array[i] = eval(menu_str); var jpg_str:String = obj_xml.firstChild.childNodes[i-1].firstChild.firstChild; obj_array[i].jpg_mc.loadMovie(jpg_str); var jumpURL:String = obj_xml.firstChild.childNodes[i-1].lastChild.firstChild.nodeValue; obj_array[i].jump = jumpURL; obj_array[i].onPress = press_me; } } } function press_me():Void { trace(this.jump); } stop(); --------------------------------------- 他で配列を再利用することがあるなら,配列を用意しても良いですが, ご質問の範囲内を見る限り, そもそも配列や変数などを用意する必要は全くないのです。 配列など遠回りをせず, 最初からムービークリップにプロパティや変数を直接ぶち込んでやっても良いのです。 ムービークリップにプロパティや変数を直接入れるのでしたら次のようにします。 --------------------------------------- System.useCodepage = true; var obj_xml:XML = new XML(); obj_xml.onLoad = start_me; obj_xml.ignoreWhite = true; obj_xml.load("scrollslide.xml"); function start_me(success:Boolean):Void { if (success == true) { for (var i = 1; i<=1; i++) { _root.attachMovie("menu", "menu"+i, i); var jpg_str:String = obj_xml.firstChild.childNodes[i-1].firstChild.firstChild; _root["menu"+i].jpg_mc.loadMovie(jpg_str); var jumpURL:String = obj_xml.firstChild.childNodes[i-1].lastChild.firstChild.nodeValue; _root["menu"+i].jump = jumpURL; _root["menu"+i].onPress = press_me; } } } function press_me():Void { trace(this.jump); } stop(); --------------------------------------- 配列など使うより,短くスッキリする上, 遠回りな言い回しがないでわかりやすくなります。 「ドットシンタックスと配列アクセス演算子」 http://www.fumiononaka.com/TechNotes/Flash/FN0507001.html
その他の回答 (1)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
変数 jump を指定する部分だけを抜き書きします。 for (var i = 1; i<=menu_num; i++) { var jumpURL:String = obj_xml.firstChild.childNodes[i-1].lastChild.firstChild.nodeValue; jump = jumpURL; } 何回でも同じ jump に順次違う URL を代入しているだけじゃないですか。 -------------------- jump = "aaa.html"; jump = "bbb.html"; jump = "ccc.html"; jump = "ddd.html"; … … jump = "zzz.html"; -------------------- ↑ 結局 変数 jump には "zzz.html" が代入されるだけ。 this.変数 とか this._parent.変数 とか言う問題ではありませんよね。 他の変数やプロパティ(num や _x や _y など)と同様にすれば良いのではないでしょうか? 逆に言えば, なぜ jump についてだけ 他の変数やプロパティ と同様にしないのですか? どう見てもそこだけ違うので浮いて見えますよ。
お礼
シンプルな内容がなぜ・・という意味がやっとわかりました。 obj_array[i].jump = jumpURL; ・・だけだったのですね。(汗) 結局スキル不足が余計な事を色々考えさせていたのだと思います。 何の問題もなく動作しました。 丁寧な対応をしていただき本当にありがとうございました。 イチから出直してきます。
補足
ご指摘ありがとうございます。 確かにそのとおりですね。 ゴチャゴチャやっているうちに、配列の仕掛けを無視していました。 そこで配列に組み込み、以下のようにXMLからURL部分を読み込む変数jumpURLを関連付けてみましたが、今度はリンクが「Not Found」になってしまいました。(もちろんxmlファイルの内容は同様です) ~以下1フレーム目のフレームスクリプト~ var obj_array:Array = new Array(); ・ ・一部省略 ・ var jpg_str:String = obj_xml.firstChild.childNodes[i-1].firstChild.firstChild; obj_array[i].jpg_mc.loadMovie(jpg_str); var jumpURL:String = obj_xml.firstChild.childNodes[i-1].lastChild.firstChild.nodeValue; obj_array[i].jump_mc.loadVariables(jumpURL); trace(jump); obj_array[i].onEnterFrame = scrollphoto_me; obj_array[i].onPress = press_me; obj_array[i].onRollOver = roll_me; obj_array[i].onRollOut = rollout_me; } . .一部省略 . function press_me():Void { getURL(this.jumpURL); } function roll_me():Void { this._alpha = 100; } function rollout_me():Void { this._alpha = 70; } stop(); 基本的に構造を誤解しているかも・・?という不安の元にこの書き込みをしています。 大変お手数ではありますが、ぜひわかりやすくご教示くださいます様お願い致します。