- ベストアンサー
外部テキストファイルから座標データを読み込み、ムービークリップを配置し画像を読み込ませる
- 外部テキストファイルから座標を読み込み、ムービークリップを作成し、そのムービークリップに座標を割り当て、画像を読み込ませます。
- ムービークリップのロールオーバー時に、テキストボックスに店名と簡単な店舗詳細を表示するスクリプトを組みたいです。
- 地図に配置したムービークリップにロールオーバーすると店舗詳細が表示される仕組みを作りたいです。
- みんなの回答 (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> ===================
その他の回答 (1)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
なるほど。 スクリプトを見てしたいことの大筋がわかりました。 方法は大きく分けて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つ目です。
お礼
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> という形にしたいのですが、もしよろしければご教授頂けないでしょうか?本当にすみません。よろしくお願い致します。
お礼
BlurFiltanさん本当にありがとうございます!xmlで読み込むことができ、お蔭様で理想通りの地図配置のフラッシュを完成させる事ができました!後半は無理を言ってしまってすみませんでした・・・。xmlの読み取り方法までご教授頂き、本当に勉強になりました。このスレッドでしかお礼が言えないのがとても悔やまれます。これからもっと勉強してBlurFiltanさんみたいなスマートなスクリプトを書けるようにしたいと思います。本当にありがとうございました!