• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:外部テキストファイルから座標データを読み込み,その座標にムービークリップを配置する)

外部テキストファイルから座標データを読み込み,ムービークリップを配置

このQ&Aのポイント
  • 外部テキストファイルから座標データを読み込み,その座標にムービークリップを配置する方法を教えてください。
  • ムービークリップを配置するためには外部テキストファイルのデータを行ごとに読み込む必要があります。
  • オブジェクト指向を使わずにプログラムを作成する方法を教えてください。

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1 です。 すみません,返事の回答が遅くなりました。 >変更案1で試してみようと思います. そうですか。データの形を変えられるのでしたら楽です。 > これに関してなのですが, > ファイル数というのは配置するムービークリップの数ということでしょうか? そうですそうです。すみません,書き間違えです。 #1の回答(補足要求)を書いているうちに, 現存する ムービークリップ(以下MCと略)の座標指定ではなく, ロードする外部ファイル(JPEG や SWF など)の座標を指定するということに勝手にすり変わっていました。 ですから,他の場所(XMLのノード名)など,少しズレた名前になっています。 ファイル数ではなく配置するムービークリップの数のことです。 そういうわけで, サンプル例を回答します。 SWF と, それを表示させる HTML と, 外部テキストファイル を同じフォルダに入れてあるとします。 外部テキストのファイル名は,「mcdata.txt」(MCデータの意味)ということにしておきます。 「mcdata.txt」の内容データ例を次のようにします(コピペ可能)。 ------------------------------------- mcNum=5& &name0=0&x0=10&y0=20& &name1=1&x1=20&y1=24& &name2=2&x2=30&y2=28& &name3=3&x3=40&y3=32& &name4=4&x4=50&y4=34& ------------------------------------- Flash を起動させて, 上の「mcdata.txt」と同じフォルダに, 新規ドキュメントを保存して フレーム1 に書きます(コピペ可能)。 ///////////////////////////////////////////////////// // MCを作成するユーザ定義関数 makeMC の定義(本来不要) function makeMC(n) { for (i=0; i<=n-1; i++) { // 空のMC myMC? を 深度 i に作成 _root.createEmptyMovieClip("my_mc"+myLV["name"+i], i); // パスの変数化 mm = _root["my_mc"+myLV["name"+i]]; // 初期座標指定(見えないところ) mm._x = mm._y=-100; // MC名入りテキストフィールドの作成 mm.createTextField("my_txt", 0, 0, 0, 80, 60); mm.my_txt.border = true; mm.my_txt.background = true; mm.my_txt.backgroundColor = 0xCCCCCC; mm.my_txt.text = "my_mc"+myLV["name"+i]; // 確認のためMCを一応ドラッグ可能にしておきます mm.onPress = function() { this.startDrag(); this.my_txt.backgroundColor = 0xEEEEEE; }; mm.onRelease = mm.onReleaseOutside=function () { this.stopDrag(); this.my_txt.backgroundColor = 0xCCCCCC; }; } } // //--- ↑以上は本来不要です↑ --- //--- ↓以下が本題部分です↓ --- // // LoadVarsクラスのインスタンス myLV を作成 myLV = new LoadVars(); // // myLV にデータが読み込まれたときの動作定義 myLV.onLoad = function(Seikou) { // ロード成功時 if (Seikou) { //ユーザ定義関数 makeMC の実行(本来不要) makeMC(this.mcNum); // 各MCの座標指定 for (i=0; i<=this.mcNum-1; i++) { _root["my_mc"+this["name"+i]]._x = this["x"+i]; _root["my_mc"+this["name"+i]]._y = this["y"+i]; } } else { // ロード失敗時 trace("テキストファイルのロード失敗"); } }; // // 外部テキストのロード myLV.load("mcdata.txt"); ///////////////////////////////////////////////////// そして, 「制御」→「ムービープレビュー」してもらうと, 即,動作確認ができると思います。 各MCは重なって表示されますから,確認がしにくいと思ってドラッグ可能にしていますから, ドラッグして確認してみてください。 ~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・ ◎ 以下の長い説明は   上のコードだけで理解できた場合,全く不要です。   適当に読み流してください。 MCは本来 Flash 内にすでに作成されていると思うため, 上のスクリプトの上半分が不要な部分です。 MCのインスタンス名に数字のみを付けるのは良くないことなので, my_mc0,my_mc1,my_mc2,… のような,文字列+数字 というインスタンス名を付けた場合として考えています。 改行の前と後に & を書いているのは, 改行コードというゴミが変数の値の中に入るのを防止するためです。 上のスクリプトでは, myLV という LoadVars クラスのインスタンス(外部から読み込んだテキストデータの入れ物)を作成して, その myLV に外部テキストデータを全て入れこんでいます。 この myLV から目的の値を取りだしてそれぞれの処理をさせます。 外部データを 読み込む前 に色々な動作をさせても, 肝腎のデータがないのですから座標の指定などはできません。 したがって, myLV.onLoad = function() { } で, myLV に外部テキストデータの読み込み終了次第, myLV から必要なデータを取りだすような動作をさせています。 このロード待ちの処理が必要である辺が,Web系 の面倒臭いところです。 その myLV.onLoad 内のスクリプトに関してですが, おそらくこの部分↓がややこしいのではないかと思います。 _root["my_mc"+this["name"+i]]._x = this["x"+i]; [ ] は配列アクセス演算子と呼ばれる物で, 動的に違う変数やインスタンスにアクセスするときに使うことができます。 [ ] 内は1つの階層として Flash が扱ってくれます。 また,この場合(この場合に限って)の this は myLV のことを指します。 したがって, this["name"+i] これ↑は,「myLV 内の変数 name0~4 の値」 という意味になります。 name の後の 0,1,2,3,4 は for文によって切り替えています。 「name0~4 の値」は外部テキストで指定した 0,1,2,3,4 です。 したがって, _root["my_mc"+this["name"+i]] これ↑は 「_root.my_mc0~4」 のMCインスタンスということになります。 ですから, _root["my_mc"+this["name"+i]]._x これ↑は 「_root.my_mc0~4 の x座標」ということになります。 したがって, _root["my_mc"+this["name"+i]]._x = this["x"+i]; この1行をトータルで考えると, 「_root.my_mc0~4 の x座標 を myLV 内の変数 x0~4 の値に設定する」 ということになります。 たまたま, MC の名称 my_mc0~4 と,for文の i の 0~4 がかぶっているため,わかりにくくなっていますが, 0~4 のように連番でないインスタンス名でも指定できます↓。 例えば外部テキスト 「mcdata.txt」 の内容データ例を次のように変えて, 「制御」→「ムービープレビュー」しなおしてもらうと, インスタンス名などを変更したときの実験検証できると思います(コピペ可能)。 ------------------------------------- mcNum=10& &name0=A&x0=10&y0=20& &name1=B&x1=40&y1=22& &name2=C&x2=60&y2=26& &name3=D&x3=75&y3=32& &name4=E&x4=88&y4=40& &name5=F&x5=98&y5=50& &name6=G&x6=106&y6=62& &name7=H&x7=112&y7=76& &name8=I&x8=116&y8=92& &name9=J&x9=117&y9=110& ------------------------------------- 「LoadVars.onLoad」 と 「配列アクセス演算子」 とをネット検索してもらうと, その他詳細がだいたいはわかるのではないかと思います。 Google検索 「LoadVars.onLoad」 http://www.google.co.jp/search?hl=ja&q=LoadVars.onLoad Google検索 「配列アクセス演算子」 http://www.google.co.jp/search?hl=ja&q=%22%E9%85%8D%E5%88%97%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%BC%94%E7%AE%97%E5%AD%90

ekaki_san
質問者

お礼

大変わかりやすくご解説いただきありがとうございました. とても勉強になりました. ありがとうございました.

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

データの形が悪いですよ。 そのままだと,できたとしても変な労力がやたらかかります。 name=0, x=10, y=20 &name=1, x=11, y=21 &name=2, x=12, y=22 これを,操作しやすいデータ形式に変更はできないものでしょうか。 変更案1. 変数と値をちゃんとした1対1対応にできませんか? <変更例> name0=0&x0=10&y0=20& &name1=1&x1=11&y1=21& &name2=2&x2=12&y2=22& 変更案2. XML 形式にすることはできませんか? <変更例> <?xml version="1.0" encoding="Shift-JIS"?> <file> <fileNode name="0" x="1" y="2" /> <fileNode name="1" x="11" y="21" /> <fileNode name="2" x="12" y="22" /> </file> 変更案3. CSV 形式にすることはできませんか? <変更例> 0,10,20 1,11,21 2,12,22 変更案1 の場合は,LoadVarsクラス(LoadVarsオブジェクト)のメソッドでなんとかなります。 できれば, name0 の前に, filenum=20 などというようなファイル数を示すデータがあった方が良いですが。 変更案2 の場合は,XMLクラス(XMLオブジェクト)のメソッドでなんとかなります。 変更案1 もしくは 変更案2 のようにするのが普通です。 変更案3 でもできなくはありませんが手間です。 また,改行コードが \n であるのか \r であるのか \r\n であるのかによって, データ行を split する文字列が変わります。 変更案3のゴミだらけバージョンがご質問のデータ形式だと言う感じだと思います。 ですから, 変更案3のデータが処理できるようしたあと,次にゴミ削除の処理が入ります。 したがってそのままだと,できたとしても変な労力がやたらかかることになります。 変更案1~3までに変更できるのでしたら,それなりに考えてみても良いとは思いますが, 変更可能か変更不可能かがわかりませんので,即答はできません。 絶対にデータ形式を変更できない場合は,改行コードだけでも補足してください。 また,縦向きデータ(改行前後)ではなく, 横向きデータのデータ間に 「,(カンマ)」 と 「" "(半角空白文字)」が入っていますが, この半角空白文字はデータなのか,データ区切りなのか,半角空白文字も入れたままで変更できないのかどうかのところも補足してください。 考えればなんとかできるかもしれません(考えたあげくできないかもしれませんが)。

ekaki_san
質問者

補足

ご返信ありがとうございます.大変参考になります. 外部テキストファイルに関しては自由に変更可能です. XMLに関してはあまり馴染みがないので, 変更案1で試してみようと思います. > name0 の前に,filenum=20などというようなファイル数を示すデータがあった方が良いですが。 これに関してなのですが,ファイル数というのは配置するムービークリップの数ということでしょうか?これに関しても出力することは可能です. ※今回,C言語で作ったシミュレータの可視化にFLASHを使用しようと思っていますので,出力は自由に変更できます.