【お知らせ】まとめて検索などの提供終了

たびたびすみません、追記いたします。
外部テキストファイルから座標を読み込み、ムービークリップを作成し、そのムービークリップに座標を割り当て、画像を読み込ませ、さらにそのムービークリップのロールオーバー時に、あらかじめ作成しておいたテキストボックスに店名と簡単な店舗詳細を表示するというスクリプトを組みたいのですが、なかなかうまくいきません。使いどころとしては地図にそれらのムービークリップを配置し、そのランドマーク画像にロールオーバーしたら店舗詳細が現れるといったものを作りたいです。いろいろなサイトや本を参考にしながら下記スクリプトを作成致しましたが、うまくうごきません。たぶんloadMovieの読み込みのタイミングあたりがおかしいのだと思いますが、ムービークリップを新規に作成するときに、フレームアクションで画像の読み込みとその後の処理をどうやって記述したらよいのかがわかりません。まだまだ知識不足なもので、どなたかご教授頂けないでしょうか?よろしく御願い致します。

↓フレームアクション↓
function makeMC(n) {
for (i=1; i<=n; i++) {
_root.createEmptyMovieClip("mc"+myLV["name"+i],i);
mmLD = new Object();
mmLD.onData = function(LDOK) {
if (LDOK) {
_root["mc"+myLV["name"+i]].onPress = function() {
_root.t_box.text_a.text = this["text_a"+i];
_root.t_box.text_b.text = this["text_b"+i];
};
_root["mc"+myLV["name"+i]].onRelease = _root["mc"+myLV["name"+i]].onReleaseOutside=function () {
_root.t_box.text_a.text = "";
_root.t_box.text_b.text = "";
};
} else {
trace("イメージファイルのロード失敗");
}
mmLD.loadMovie("images/"+i+".jpg");
};
}
}

myLV = new LoadVars();
myLV.onLoad = function(TEXTOK) {
if (TEXTOK) {
makeMC(this.mcNum);
for (i=1; i<=this.mcNum; i++) {
_root["mc"+this["name"+i]]._x = this["x"+i];
_root["mc"+this["name"+i]]._y = this["y"+i];
}
} else {
trace("テキストファイルのロード失敗");
}
};
myLV.load("mcdata.txt");

↓あらかじめ作成したムービークリップの詳細↓
インスタンス名「t_box」というムービークリップの中に「text_a」「text_b」というダイナミックテキストが入っております。

↓外部テキストファイル↓
mcNum=10&
&name1=1&x1=20&y1=20&text_a1=サンプル店名(1)&text_b1=店の説明(1)&
&name2=2&x2=40&y2=40&text_a2=サンプル店名(2)&text_b2=店の説明(2)&
&name3=3&x3=60&y3=60&text_a3=サンプル店名(3)&text_b3=店の説明(3)&
&name4=4&x4=80&y4=80&text_a4=サンプル店名(4)&text_b4=店の説明(4)&
&name5=5&x5=100&y5=100&text_a5=サンプル店名(5)&text_b5=店の説明(5)&
&name6=6&x6=120&y6=120&text_a6=サンプル店名(6)&text_b6=店の説明(6)&
&name7=7&x7=140&y7=140&text_a7=サンプル店名(7)&text_b7=店の説明(7)&
&name8=8&x8=160&y8=160&text_a8=サンプル店名(8)&text_b8=店の説明(8)&
&name9=9&x9=180&y9=180&text_a9=サンプル店名(9)&text_b9=店の説明(9)&
&name10=10&x10=200&y10=200&text_a10=サンプル店名(10)&text_b10=店の説明(10)

どうかよろしく御願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

#1です。



> <?xml version="1.0" encoding="utf-8"?>
> <file>
> <fileNode name="1" x="20" y="20" text_a="店名(1)" text_b="店舗詳細(1)" />
> <fileNode name="2" x="40" y="40" text_a="店名(2)" text_b="店舗詳細(2)" />
> <fileNode name="3" x="60" y="60" text_a="店名(3)" text_b="店舗詳細(3)" />
> </file>
>
> という形にしたいのですが、

ということですが,
データを取ってくる取り方(変数の名指しのしかた)が違うだけのことで,
LoadVars も XML もほとんど同じですよ。

XML データに 「mcdata.xml」 という名前を付けて任意のフォルダに保存し,
そのフォルダにFlashの新規ドキュメントを作成して,
次のようなスクリプトをフレーム1に書いて,
「制御」→「ムービープレビュー」すると,XML内のデータの取得のしかた(呼び方)がわかると思います。

---------------------------------------------------
// XML インスタンスを作成
myXML = new XML();

// ★これが加わることがLoadVarsと違うくらい
// XML 内の余分な空白や改行を無視する設定にする
myXML.ignoreWhite = true;

// XMLがロードされたときに実行する関数の定義
myXML.onLoad = function(XMLOK) {
// XML のロードが成功すれば
if (XMLOK) {
// XML探査用関数 probeXML ↓ を実行させます
probeXML();
} else {
trace("XMLファイルのロード失敗");
}
};

// 外部XMLファイル「mcdata.xml」をロード
myXML.load("mcdata.xml");

//---XML内探査関数の定義---
function probeXML() {
trace("●myXML="+myXML);
trace("●myXML.firstChild="+myXML.firstChild);
trace("●myXML.firstChild.childNodes.length(データ数)="+myXML.firstChild.childNodes.length);
trace("●myXML.firstChild.childNodes[0]="+myXML.firstChild.childNodes[0]);
trace("●myXML.firstChild.childNodes[0].attributes.name="+myXML.firstChild.childNodes[0].attributes.name);
trace("●myXML.firstChild.childNodes[0].attributes.text_a="+myXML.firstChild.childNodes[0].attributes.text_a);
}
---------------------------------------------------

やたら横長ですが。


つまり,
書かれていらっしゃる XML の構造は,
次のようになっている(次のような名前で呼べる)ということです。

===================
<?xml version="1.0" encoding="utf-8"?>
<file> ←firstChild
  <fileNode name="1" ~略~ (1)" /> ←firstChild.childNodes[0]
         ↑firstChild.childNodes[0].attributes.name
  <fileNode name="2" ~略~ (2)" /> ←firstChild.childNodes[1]
  <fileNode name="3" ~略~ (3)" /> ←firstChild.childNodes[2]
</file>
===================
  
    • good
    • 0
この回答へのお礼

BlurFiltanさん本当にありがとうございます!xmlで読み込むことができ、お蔭様で理想通りの地図配置のフラッシュを完成させる事ができました!後半は無理を言ってしまってすみませんでした・・・。xmlの読み取り方法までご教授頂き、本当に勉強になりました。このスレッドでしかお礼が言えないのがとても悔やまれます。これからもっと勉強してBlurFiltanさんみたいなスマートなスクリプトを書けるようにしたいと思います。本当にありがとうございました!

お礼日時:2008/06/02 18:01

なるほど。


スクリプトを見てしたいことの大筋がわかりました。
方法は大きく分けて2つあると思います。


1つめはMovieClipLoaderクラスを使う方法で,
こちらの方が質問内容に近い形のスクリプトになります。
ただし,Flash MX 2004 以上が必要です。
Flash のバージョンを書かれていらしゃらないためこれが使えるかどうかはわかりません。

2つめはMovieClipLoaderクラスを使わずに,
ムービークリップを親子の入れ子で作成して,
子ムービークリップにJPEGをロードする方法です。
こちらの方がスクリプトがシンプルな上,LoadVarsが使えるようになった Flash MX でも使用可能です。
ただし,JPEGのロード失敗は得られません。

一応2つともスクリプトを書いておきます。
両方ともコピペするだけで使えると思います。



◎MovieClipLoaderクラスを使う方法
  要:FlashMX2004以上,FlashPlayer7以上にパブリッシュ

-------------------------------------------
function makeMC(n) {
// 指定座標の場所にムービークリップを作成
for (i=1; i<=n; i++) {
_root.createEmptyMovieClip("mc"+myLV["name"+i], i);
_root["mc"+myLV["name"+i]]._x = myLV["x"+i];
_root["mc"+myLV["name"+i]]._y = myLV["y"+i];
}
//
// 変数 i の初期値を設定(本当は i ではないほうが良い)
i = 1;
//
// MovieClipLoaderクラスのインスタンス myMCL を作成
myMCL = new MovieClipLoader();
// ロード監視オブジェクト mmLD を作成
mmLD = new Object();
//
// ロード完了時の動作定義
mmLD.onLoadInit = function(TARGET) {
//
// ロードされたムービークリップ内の変数 num に i を代入
TARGET.num = i;
//
// ロードされたムービークリッププレス時の動作を定義
TARGET.onPress = function() {
// このムービークリップ内の num 番 のテキストを表示
_root.t_box.text_a.text = myLV["text_a"+this.num];
_root.t_box.text_b.text = myLV["text_b"+this.num];
};
//
// ロードされたムービークリップを放したときの動作を定義
TARGET.onRelease = TARGET.onReleaseOutside=function () {
_root.t_box.text_a.text = "";
_root.t_box.text_b.text = "";
};
//
// 変数 i に1を加算
i++;
// n 以下であれば次の JPEG をロード
if (i<=n) {
myMCL.loadClip("images/"+i+".jpg", "mc"+myLV["name"+i]);
}
};
//
// ロード失敗時の動作を定義
mmLD.onLoadError = function(TARGET) {
trace(TARGET+" にイメージファイルのロード失敗");
// 変数 i に1を加算
i++;
// n 以下であれば次の JPEG をロード
if (i<=n) {
myMCL.loadClip("images/"+i+".jpg", "mc"+myLV["name"+i]);
}
};
//
// myMCL のリスナーとして mmLD を登録
myMCL.addListener(mmLD);
// 最初の JPEG をロード
myMCL.loadClip("images/"+i+".jpg", "mc"+myLV["name"+i]);
}

myLV = new LoadVars();

myLV.onLoad = function(TEXTOK) {
if (TEXTOK) {
makeMC(this.mcNum);
} else {
trace("テキストファイルのロード失敗");
}
};

myLV.load("mcdata.txt");
-------------------------------------------



◎親子の入れ子ムービークリップを作成する方法
  要:FlashMX以上,FlashPlayer6以上にパブリッシュ

-------------------------------------------
function makeMC(n) {
for (i=1; i<=n; i++) {
// _root に空の親ムービークリップを作成
_root.createEmptyMovieClip("mc"+myLV["name"+i], i);
// その中にさらにロード用子ムービークリップ _mc を作る
_root["mc"+myLV["name"+i]].createEmptyMovieClip("_mc", 0);
// 親ムービークリップ の座標指定
_root["mc"+myLV["name"+i]]._x = myLV["x"+i];
_root["mc"+myLV["name"+i]]._y = myLV["y"+i];
// 親ムービークリップ内の変数 num に i を代入
_root["mc"+myLV["name"+i]].num = i;
//
// 親ムービークリッププレス時の動作を定義
_root["mc"+myLV["name"+i]].onPress = function() {
// このムービークリップ内の num 番 のテキストを表示
_root.t_box.text_a.text = myLV["text_a"+this.num];
_root.t_box.text_b.text = myLV["text_b"+this.num];
};
//
// 親ムービークリップを放したときの動作を定義
_root["mc"+myLV["name"+i]].onRelease = _root["mc"+myLV["name"+i]].onReleaseOutside=function () {
_root.t_box.text_a.text = "";
_root.t_box.text_b.text = "";
};
//
// 子ムービークリップにJPEGをロード
_root["mc"+myLV["name"+i]]._mc.loadMovie("images/"+i+".jpg");
}
}

myLV = new LoadVars();

myLV.onLoad = function(TEXTOK) {
if (TEXTOK) {
makeMC(this.mcNum);
} else {
trace("テキストファイルのロード失敗");
}
};

myLV.load("mcdata.txt");
-------------------------------------------



JPEGのロード失敗が得られないのが難点かもしれませんが,
私の個人的な好みは2つ目です。
    • good
    • 0
この回答へのお礼

BlurFiltanさん、本当にありがとうございました!!実はスクリプトや外部ファイルを見て頂ければわかる通り、以前どなたかの質問でBlurFiltanさんが回答されていたのを参考に作りました。勝手な引用失礼致しました。お恥ずかしい限りです・・・。

MovieClipLoaderを使うところ、onLoadInitで動作完了を定義するやり方、とても勉強になりました!僕のFlashバージョンは「8」なので、前者のやり方で対応できました。本当にありがとうございました。

実を言うと、この続きとしてやろうと思っていたことがありまして。。。以前の質問にも書いてありましたが、読み込む外部ファイルをxmlで読み込めないかと思いまして、いろいろ試していたのですが、これもまたうまく動かない次第でございます。最終的にはCMSでxmlで吐き出しそれをswfファイルに読ませて。。。という事を行おうと思って降りました。

形としては以前の質問どうり

<?xml version="1.0" encoding="utf-8"?>
<file>
<fileNode name="1" x="20" y="20" text_a="店名(1)" text_b="店舗詳細(1)" />
<fileNode name="2" x="40" y="40" text_a="店名(2)" text_b="店舗詳細(2)" />
<fileNode name="3" x="60" y="60" text_a="店名(3)" text_b="店舗詳細(3)" />
</file>

という形にしたいのですが、もしよろしければご教授頂けないでしょうか?本当にすみません。よろしくお願い致します。

お礼日時:2008/06/01 13:31

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


人気Q&Aランキング