• ベストアンサー
  • すぐに回答を!

外部XMLからFlashに読み込んだ画像にリンクをつける方法

  • 質問No.5110026
  • 閲覧数879
  • ありがとう数5
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 50% (1/2)

初めまして。
この度初めて外部XMLをFlashに読み込むコンテンツを制作しており、最後の段階でハマっておりますため、皆様のお力をお借りできればと思い投稿させていただきました。
ちなみに制作環境はMac OS10.3、flashはCS3です。

よくあるパターンのflashによる横スクロールメニュー(画像がマウス操作で左右に流れるもの)を作成しておりますが、表示される10枚の画像をflash内ではなく、外部imagesフォルダに置いておき、XMLにてflash内に作成されたムービークリップに読み込み表示させるコンテンツで、表示されたそれぞれの画像に、やはりXML内に記述されたそれぞれ別のURLを指定して、クリックでジャンプさせようとしています。

横スクロールに関しては問題なく表示できましたが、問題はリンクです。traceでは10個のURLが戻ってくるのですが、実際に各画像をクリックしてみると、全ての画像が10番目のリンク先となってしまっています。
ネットでも色々調べてみたのですが、getURL(this.変数)ではなくgetURL(this._parent.変数)にする等試してみましたがうまくいきません。

下記にActionScriptとXMLファイルの内容を記載致しますので、ご参考の上、ご回答いただけましたらありがたく思います。

~以下1フレーム目のフレームスクリプト~
var obj_array:Array = new Array();
var center:Number = Stage.width/2;
var menu_num:Number = 10;
var maxlength:Number = 120*menu_num;
var friction:Number = -0.03;
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<=menu_num; i++) {
var menu_str:String = "menu"+i;
_root.attachMovie("menu", menu_str, i);
obj_array[i] = eval(menu_str);
obj_array[i].num = i;
obj_array[i]._x = 120*(i-1);
obj_array[i]._y = 30;
obj_array[i]._alpha = 70;
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;
jump = 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;
}
} else {
seltext = "xml read error";
}
}
function scrollphoto_me():Void {
var speed:Number = (_root._xmouse-center)*friction;
var vx:Number = this._x+speed;
if (vx<=-120) {
vx += maxlength;
vx = Math.round(vx);
} else if (vx>=Stage.width-5) {
vx -= maxlength;
}
vx1 = Math.round(vx);
this._x = vx1;
updateAfterEvent();
}
function press_me():Void {
getURL(this.jump);
}
function roll_me():Void {
this._alpha = 100;
}
function rollout_me():Void {
this._alpha = 70;
}
stop();

~以下XMLファイルの記述~
<?xml version="1.0" encoding="Shift_JIS"?>
<jpeg>
<jumpURL>
<jpegURL>images/fla/image1.jpg</jpegURL>
<URL>http://www.yahoo.co.jp</URL>
</jumpURL>
<jumpURL>
<jpegURL>images/fla/image2.jpg</jpegURL>
<URL>http://www.exnos.co.jp</URL>
</jumpURL>
<jumpURL>
<jpegURL>images/fla/image3.jpg</jpegURL>
<URL>http://www.sony.co.jp</URL>
</jumpURL>
<jumpURL>
<jpegURL>images/fla/image4.jpg</jpegURL>
<URL>http://www.toyota.co.jp</URL>
</jumpURL>
<jumpURL>
<jpegURL>images/fla/image5.jpg</jpegURL>
<URL>http://www.nissan.co.jp</URL>
</jumpURL>
<jumpURL>
<jpegURL>images/fla/image6.jpg</jpegURL>
<URL>http://www.honda.co.jp</URL>
</jumpURL>
<jumpURL>
<jpegURL>images/fla/image7.jpg</jpegURL>
<URL>http://www.mafdamino.com</URL>
</jumpURL>
<jumpURL>
<jpegURL>images/fla/image8.jpg</jpegURL>
<URL>http://www.nakata.net</URL>
</jumpURL>
<jumpURL>
<jpegURL>images/fla/image9.jpg</jpegURL>
<URL>http://www.nifty.com</URL>
</jumpURL>
<jumpURL>
<jpegURL>images/fla/image10.jpg</jpegURL>
<URL>http://www.adobe.com</URL>
</jumpURL>
</jpeg>
以上、よろしくお願致します。

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

  • 回答No.2
  • ベストアンサー

ベストアンサー率 91% (1611/1754)

#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件)

  • 回答No.1

ベストアンサー率 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 についてだけ 他の変数やプロパティ と同様にしないのですか?
どう見てもそこだけ違うので浮いて見えますよ。
補足コメント
neo4605

お礼率 50% (1/2)

ご指摘ありがとうございます。
確かにそのとおりですね。
ゴチャゴチャやっているうちに、配列の仕掛けを無視していました。

そこで配列に組み込み、以下のように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();

基本的に構造を誤解しているかも・・?という不安の元にこの書き込みをしています。
大変お手数ではありますが、ぜひわかりやすくご教示くださいます様お願い致します。
投稿日時:2009/07/09 23:25
お礼コメント
neo4605

お礼率 50% (1/2)

シンプルな内容がなぜ・・という意味がやっとわかりました。

obj_array[i].jump = jumpURL;

・・だけだったのですね。(汗)

結局スキル不足が余計な事を色々考えさせていたのだと思います。
何の問題もなく動作しました。

丁寧な対応をしていただき本当にありがとうございました。
イチから出直してきます。
投稿日時:2009/07/11 21:16
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ