• ベストアンサー

配列で呼び出しMCやボタンにしたい

いつもお世話になっております。 以前配列の処理の仕方について投稿させて頂きました。 http://okwave.jp/qa3709770.html FLASH8、AS2.0です。 こちらを参考に // 外部データがロードされたときの動作定義 myload.onData = function(moji) { // 外部データを 「,」 でsplit した要素の配列を作成 myArray = moji.split(","); // 配列の要素数を取得 mylen = myArray.length; // 要素数分のテキストフィールドの作成と値の代入 for (i=0; i<mylen; i++) { // テキストフィールドを作成 _root.createTextField("my_txt"+i, i, 20, i*30+20, 100, 22); // (見えるようにテキストフィールドの枠線を入れておきます) _root["my_txt"+i].border = true; // テキストフィールド別に配列の各要素を代入 _root["my_txt"+i].text = myArray[i]; } }; // 外部データのロード myload.load("外部読みこみのパス"); と、おかげさまで ->外部読みこみ ->内容を配列に格納 ->配列を元にテキストフィールドを作成 ここまで実現できたのですが、その次に、 そのテキストフィールド自体をボタンにしたいのですが、 (ボタン自体移動させたいのでMCにしてmouseDown予定です) どの様にしたら良いのでしょうか? 例えば、1個づつMCを作り、 その中にテキストフィールドを1個づつ格納する という、イメージを描いています。 myload.onData = function(moji) { myArray = moji.split(","); mylen = myArray.length; for (i=0; i<mylen; i++) { _root.createEmptyMovieClip("field"+i, i); _root.field+icreateTextField("my_txt"+i, i, 20, i*30+20, 100, 22); _root["my_txt"+i].border = true; _root["my_txt"+i].text = myArray[i]; } }; 例えばこんな感じでルート直下にfield+iのMCを作成し、 そのMCの中にテキストフィールドを格納する(1個づつ) というのを、試みたのですがMC自体が空で読めませんでした。 (テキストフィールドとMCの深度が重複している?) 補足要求等あればお願い致します。

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

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

> (ボタン自体移動させたいのでMCにしてmouseDown予定です) MCにするというところまでは良いと思います。 しかし mouseDown は変でしょう。 どこかでマウスダウンすると一斉に全てのボタンが動作反応してしまいます。 mouseDown ではなく,onRelease か onPress だと思います。 あと変なところは, 「#1の方が指摘されていらっしゃるところ」と, 「いったいどういうアクションをどうやってボタンに与えるの???」 という部分です。 とりあえず全体的に 「オブジェクトのインスタンス名にアクセスするときに使う『配列アクセス演算子』」 の使い方と, 「深度」や「ムービークリップ」の存在イメージをつかむ練習を, 読み込む読み込まないは別にして, 個別で練習してイメージをもつことが大切だと思います。 前回のスクリプトで, テキストフィールドのインスタンス名と深度を個別に変えたのは, 同じ階層内(ムービークリップ内(_rootもムービークリップの一種))では, 「同じインスタンス名のテキストフィールド」や, 違うインスタンス名でも「同じ深度にインスタンス」を配置できないからです。 違うインスタンス名のムービークリップを作成するのでしたら, その中に入れるテキストフィールドは, 「同じインスタンス名のテキストフィールド」の方がややこしくないですし, 深度を変える必要も全くありません。 しても単なる無駄で,混乱の原因になるだけです。 とりあえず, 各ムービークリップ内にテキストを入れるところまでのスクリプトを書きます。 --------------------------------- // LoadVarsクラスのインスタンスを作成 myload = new LoadVars(); myload.onData = function(moji) { // 外部データを 「,」 でsplit した要素の配列を作成 myArray = moji.split(","); // 配列の要素数を取得 mylen = myArray.length; // 要素数分のテキストフィールドの作成と値の代入 for (i=0; i<mylen; i++) { // ムービークリップを作成 _root.createEmptyMovieClip("my_mc"+i, i); // ムービークリップの座標指定 _root["my_mc"+i]._x = 20; _root["my_mc"+i]._y = i*30+20; // テキストフィールドを作成 _root["my_mc"+i].createTextField("my_txt", 0, 0, 0, 100, 22); // (見えるようにテキストフィールドの枠線を入れておきます) _root["my_mc"+i].my_txt.border = true; // テキストフィールド別に配列の各要素を代入 _root["my_mc"+i].my_txt.text = myArray[i]; } }; // 外部データのロード myload.load("外部読みこみのパス"); --------------------------------- 普通は, ムービークリップの基準点付近にテキストフィールドを作成しますよね。 ムービークリップ中の変なところにテキストフィールドは作成しません。 というか, テキストフィールドをムービークリップに変換するとき, そのテキストフィールドの周囲または中央に基準点を設定すると思います。 そして,位置を変える場合は, そのムービークリップを選択してドラッグして配置を決めると思います。 したがって, ムービークリップの座標を指定して, その中の一定な位置にテキストフィールドを用意する方が普通です。 ですから,   // ムービークリップを作成   _root.createEmptyMovieClip("my_mc"+i, i);   // ムービークリップの座標指定   _root["my_mc"+i]._x = 20;   _root["my_mc"+i]._y = i*30+20;   // テキストフィールドを作成   _root["my_mc"+i].createTextField("my_txt", 0, 0, 0, 100, 22); としています。 イメージを持ってコーディングしてください。 あと,_root["my_mc"+i] の [ ] が, 上で少し書いた「配列アクセス演算子」です。 名前には 「配列」 が入っていますがこの場合,配列はあまり関係がありません。 インスタンス名を動的に変動させてその各インスタンスにアクセスするときに使う物で, [ ] 内は1つの階層を意味します。 外部ファイルの読み込みとは別で, この部分だけを集中的に練習しないとなかなか使い方が身に付かないと思います。 詳しくは,そのまま検索してみてください。 http://www.google.co.jp/search?hl=ja&q=%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 ======================= 次がムービークリップをボタン化する部分ですが, これはどうすれば良いのか,作者でない私にはわかりません。 とりあえず, 実行スクリプトはダミーの trace にしておいて, ボタン化するところまでを書き加えておきます。 ------------------------------------------- // LoadVarsクラスのインスタンスを作成 myload = new LoadVars(); // 外部データがロードされたときの動作定義 myload.onData = function(moji) { // 外部データを 「,」 でsplit した要素の配列を作成 myArray = moji.split(","); // 配列の要素数を取得 mylen = myArray.length; // 要素数分のテキストフィールドの作成と値の代入 for (i=0; i<mylen; i++) { // ムービークリップを作成 _root.createEmptyMovieClip("my_mc"+i, i); // ムービークリップの座標指定 _root["my_mc"+i]._x = 20; _root["my_mc"+i]._y = i*30+20; // テキストフィールドを作成 _root["my_mc"+i].createTextField("my_txt", 0, 0, 0, 100, 22); // (見えるようにテキストフィールドの枠線を入れておきます) _root["my_mc"+i].my_txt.border = true; // テキストフィールド別に配列の各要素を代入 _root["my_mc"+i].my_txt.text = myArray[i]; // ----各MCプレス時の動作について--- // 各MCの変数 n に i を代入しておく _root["my_mc"+i].n = i; // 各MCプレス時の動作定義 _root["my_mc"+i].onPress = function() { trace("私のnは "+this.n+" です"); }; } }; // 外部データのロード myload.load("外部読みこみのパス"); ------------------------------------------- ムービープレビューしてもらうと, trace 内容が確認できると思います。 各ムービークリップには固有の n などを用意しておいて, その n を使って何かを動作させるようにすると, for文でも動作指定が可能になります。 例えば, 配列にURLを用意しておいて, n が 3 のムービークリップをクリックした場合には,  getURL(URL配列[this.n]); のようなことを動作させるとかです。

popepon
質問者

お礼

ご回答有難う御座います。 とりあえず一旦〆て ゆっくり拝見させて頂きます。

その他の回答 (1)

  • wynnjp
  • ベストアンサー率71% (5/7)
回答No.1

ブラウザ上で見ただけで動かしていないので他にも原因があるかもしれませんが、下記の部分は最低でも直す必要があります。 _root.createEmptyMovieClip("field"+i, i); _root.field+icreateTextField("my_txt"+i, i, 20, i*30+20, 100, 22);             ↓ _root.createEmptyMovieClip("field"+i, i); _root["field"+i].createTextField("my_txt"+i, i, 20, i*30+20, 100, 22); fieldが定数から変数に扱いが変わっていること、「.」で普通につなげる書き方の中で変数の足し算をできないという2つの原因の対応です。

popepon
質問者

補足

ご解答有難うございます。 大変参考になりました。 テキストフィールド自体は表示されませんでしたが、 デバッガで無事1個づつ格納されたのが確認できました。

関連するQ&A