- ベストアンサー
1000個のMCにa1~a1000のインスタンス名を一気につける方法
タイトルの通りです。 まさか地道にキーボードで打ち込んでいかないといけないのでしょうか・・・。 困っています おねがいします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
この回答はやたら長いですし, 全くの別法を3つ回答するので, 最初,回答を3回に分けようかと思いましたが, それも変なので,1回で済ませて前編と中編と後編に分けることにしました。 === ★前編★ ========================== すでに手動で配置してしまった MC に関しては, "普通" は手動でインスタンス名を付けるしかありません。 ("普通ではない場合" は,中編・後編です。 ) すでに手動で配置してしまった MC に, 一気にインスタンス名を付ける機能があるとすれば(Flash オーサリングツールにはありませんが), ステージ上の全ての MC に一気にデタラメなインスタンス名が付くでしょうから, どの MC に何という インスタンス名 が付いたかわからなくなり, 後の管理ができなくなって(かなり難しくなって)しまします。 ステージ上の全ての MC にではなく, 選択した MC のインスタンス名を一気に付ける機能があったとしても, どういう規則で付ければ良いのでしょうか。 人間の(それも個人の)考えていることなんてPCにはわかりませんから 規則を決めようがありません。 普通は,#2の方が書かれているように, 実際に1つずつ規則的に ActionScript でムービークリップインスタンスを作成しながら, 規則的にインスタンス名を付けて行くしか自動では無理だと思います。 #2 の方の書かれている, MC.attachMovie( "識別子", "インスタンス名", "深度") が一般的でしょうね。 attachMovie() に関しては,次の URLなどが参考になるかもしれません。 「ムービークリップの複製_Flash」 http://ft-lab.ne.jp/cgi-bin/wiki.cgi?page=%A5%E0%A1%BC%A5%D3%A1%BC%A5%AF%A5%EA%A5%C3%A5%D7%A4%CE%CA%A3%C0%BD%5FFlash 「ライブラリにあるMCをコピーする」 http://hakuhin.hp.infoseek.co.jp/main/as/movieclip.html#MOVIECLIP_07 /////////////////////////////////////////////////// 上記 MovieClip.attachMovie() は, ライブラリにあるムービークリップシンボルを, その識別子によって認識し, ステージ上にムービークリップインスタンスとして配置するメソッドです。 しかし,そうではなくて, MovieClip.duplicateMovieClip() という, ステージ上のムービークリップインスタンスを複製するメソッドもあります。 シンタックスは次の通りです。 MC.duplicateMovieClip("インスタンス名", 深度) 参考 URL としては, 上記 URL の2番目の URL と同じページの 「FlashにあるMCをコピーする」 http://hakuhin.hp.infoseek.co.jp/main/as/movieclip.html#MOVIECLIP_06 が参考になるかもしれません。 以下では, あえて duplicateMovieClip() を使った方法で回答します。 ライブラリの操作も不要なので,こちらの方が操作は簡単と言えば簡単です。 サンプルですから, まず,新規ドキュメントを作成してください。 ステージ上の左上の方, マス目を作りたい部分の一番左上のマスが来る辺りの位置に, Excel で言う所の A1セルの場所辺りに, 矩形ツールで, 塗りの色が "白" で,線の色が "黒" で,太さが "極細線" の小さな正方形(長方形)を描いてください。 大きさは任意ですが1マスですから, 1辺 1px ~ 20px くらいでしょうか。 --- ちょっと注釈 ---- 古いバージョンの頃は,"極細線" はデフォルトですぐに選べて, MCを拡大や縮小しても, 常に "極細線" という使い勝手の良い線でしたから線の定番的存在でしたが, Flash 5 以降はわざわざ別のパネルを出さないと指定できないので, この "極細線" の存在を知らない方もいらしゃるように思います。 Flash MX 以降では, プロパティインスペクタ で,線の太さを選ぶときに, 「カスタム」ボタンをクリックすると, 「線のスタイル」パネルが出てきますから, そこで「太さ:(T)」を "極細線" にしてください。 なぜ極細線にするかというと, 1pxの線などだと,マス目の線にムラができるからです。 ちょっとした計算誤差で,線が重なったとき太さがムラになります。 ---------------- というわけで, 塗りの色が "白" で,線の色が "黒" で,太さが "極細線" の小さな正方形(長方形)が描けましたら, その正方形(長方形)全体を選択して ムービークリップ に変換してください。 ムービークリップ に変換できたら, そのムービークリップに 「myMC0」 というインスタンス名を付けてください。 次にレイヤーを新規で作成してください。 □ レイヤー 筆・・|○| ←スクリプトを書く □ レイヤー 筆・・|●| ←「myMC0」がある その新規で作成したレイヤーの, フレーム1に次のようなスクリプトを書き, 「制御」→「ムービープレビュー」すれば, 10×10 のマス目ができ, 各 MC には 「myMC0」~「myMC99」 のインスタンス名 が付いた物が 自動的にできます。 ------------------------------------ // 横に並べる個数の設定(※可変) var yoko = 10; // 横に並べる個数の設定(※可変) var tate = 10; // // myMC0 の初期位置と大きさの記録 var my_x = _root.myMC0._x; var my_y = _root.myMC0._y; var my_w = _root.myMC0._width; var my_h = _root.myMC0._height; // 通し番号の初期値を指定 var n = 1; // // とりあえず横向きに1列配置 for (var j = 1; j<yoko; j++) { // _root.myMC0 を複製 _root.myMC0.duplicateMovieClip("myMC"+n, n); // 複製したMCの座標指定 _root["myMC"+n]._x = my_w*j+my_x; _root["myMC"+n]._y = my_y; n++; } // 2列目以降を横向きに配置 for (i=1; i<tate; i++) { for (var j = 0; j<yoko; j++) { // _root.myMC0 を複製 _root.myMC0.duplicateMovieClip("myMC"+n, n); // 複製したMCの座標指定 _root["myMC"+n]._x = my_w*j+my_x; _root["myMC"+n]._y = my_h*i+my_y; n++; } } // 本題は↑ココ↑まで // /*---検証(本題とは関係なし・MX以降)--- */ for (var k = 0; k<n; k++) { // 各MCをクリックしたときの動作を定義 _root["myMC"+k].onRelease = function() { // (↓ムービープレビューで確認できます) trace("私のインスタンス名は「"+this._name+"」です。"); }; } ------------------------------------ ご質問で Flash のバージョンを書かれていませんが, 一応,Flash MX 以上対応の回答とスクリプトです。 === ★中編★ ========================== 前編の最初にも書きましたとおり, すでに手動で配置してしまった MC に関しては, "普通" は手動でインスタンス名を付けるしかありませんし, ステージ上の全ての MC に一気にデタラメなインスタンス名が付いてしまいます。 それで良ければ次のような方法で, すでに手動で配置してしまった MC に一気にインスタンス名が付けることができます。 参考 URL 「for...inループについて」 http://www.fumiononaka.com/TechNotes/Flash/FN0110003.html 前編のように, 新規ドキュメントを作成し, 塗りの色が "白" で,線の色が "黒" で,太さが "極細線" の小さな正方形(長方形)を描いてください。 そしてその正方形(長方形)全体を選択して ムービークリップ に変換してください。 今回はそのムービークリップにインスタンス名を付けません。 その 正方形(長方形)ムービークリップをコピペで増やしてステージ上に適当に配置します。 数は適当でかまいません。 次にレイヤーを新規で作成し, その新規で作成したレイヤーの, フレーム1に次のようなスクリプトを書き, 「制御」→「ムービープレビュー」すれば, 配置したムービークリップにインスタンス名が付きます。 ----------------- // 変数 n の初期値 var n = 0; // このタイムラインの全プロパティを取り出す for (myObj in this) { // もしプロパティがMovieClipであれば if (typeof this[myObj] == "movieclip") { // そのMCに「myMC?」というインスタンス名を付ける this[myObj]._name = "myMC"+n; n++; } } // 本題は↑ココ↑まで // /*---検証(本題とは関係なし・MX以降)--- */ for (var k = 1; k<n; k++) { // 各MCをクリックしたときの動作を定義 _root["myMC"+k].onRelease = function() { // (↓ムービープレビューで確認できます) trace("私のインスタンス名は「"+this._name+"」です。"); // 全ての MC を 不透明に for (var k = 0; k<n; k++) { _root["myMC"+k]._alpha = 100; } }; } // _root.myMC0 をクリックしたときの動作を定義 _root.myMC0.onRelease = function() { // (↓ムービープレビューで確認できます) trace("私のインスタンス名は「"+this._name+"」です。"); // 全ての MC を 透明に for (var k = 0; k<n; k++) { _root["myMC"+k]._alpha = 0; } }; ------------------- 色々実験してみるとわかると思いますが, どういう規則(順番)で,インスタンス名が付くのか良くわかりませんし, その制御の方法もわかりません。 for in文で対象物を捜査する順番に関しては, 配列の要素などのきれいな要素列の場合, 一応は最後の要素から順に捜査するようですが, いつも最後からとは保証されていません。 配列をソートした場合は無茶苦茶な順番になるそうです。 この場合ムービークリップですから,さらにどういう順で捜査されるのかはわかりません。 今回の実験の結果, 同じレイヤー内では,積み重ね順が上のムービークリップほど, (積み重ね順を変更しなければ最後に作られたMCほど,) 若い番号が付きましたが,これも保証されていません。 ムービークリップをさらに新規で作った場合や, ムービークリップを動かした場合など, 作成手順などによって,インスタンス名は変わってしまうと思います。 つまり, ご質問にあるようなことは, ActionScript を使うと,Flash Player 上ではできますが, できても使いようがない(非常に使いにくい)と思います。 使いようがない(非常に使いにくい)ので,こういう方法はおそらくどこにも書いていないのだと思います。 この中編を実際にしてみるか,イメージすると, なぜ Flash オーサリングツール のデフォルト機能としてこの機能がないのかが実感でわかると思います。 また,これが理由でおそらく将来的にも, Flash オーサリングツール のデフォルト機能としても付かないのではないかと思います(多分)。 === ★後編★ ========================== でも,JSFL を研究して, 自分なりにしたいことをプログラミングすればなんとかなるかもしれません。 しかし,私は JSFL の専門ではありませんし, 日本でもコレの専門家はおそらくいないでしょう。 また,物によってスクリプトは全然変わると思うのでヒントだけ… 以下URLは, Flash 8 のヘルプのオンラインバージョンです。 JSFL は,Word や Excel におけるマクロのような存在で, Flashオーサリング環境での JavaScript です。 Flash MX 2004 以降で使えます。 Flash の拡張機能 オブジェクト > Element オブジェクト > element.name http://livedocs.macromedia.com/flash/8_jp/main/00004577.html > ---引用--- > 例 > 次の例では、フレーム 1 の上側のレイヤーにある > 最初のエレメントのインスタンス名を "clip_mc" に設定します。 > > fl.getDocumentDOM().getTimeline().layers[0].frames[0].elements[0].name = "clip_mc"; Flash の拡張機能 オブジェクト > Element オブジェクト > element.elementType http://livedocs.macromedia.com/flash/8_jp/main/00004569.html
その他の回答 (2)
- o_o_______
- ベストアンサー率42% (3/7)
例えばさっきの方法でmcを100個作るでしょ? そのときついでに四角をattachMovieで配置すればいいよ。 xと_yもそこでついでに指定してやればいいよ。
- o_o_______
- ベストアンサー率42% (3/7)
//1000個のmcを入れるためのtest_mcを作る createEmptyMovieClip("test_mc",1); //test_mcにa1~a1000までのmcを作る for(i=0 ; i<=1000 ; i++){ mcName="a"+i; test_mc.createEmptyMovieClip(mcName,i); //以下は作ったmcの確認用のtrace mcNum=eval(test_mc+".a"+i); trace(mcNum); } こういうことでしょうか?
お礼
回答本当にありがとうございます。 本当は1000じゃなくて1万くらいなので本当に助かりました。
補足
しかし、問題が発生しました。 MCへのインスタンス名のつけ方はわかったのですが、 実際にオブジェクトにどうやってつけるかがわかりません。 作りたいものは、 MCによる10行×10行のマス目です。 つまり100個の正方形MCにインスタンス名を付けていきたいのですがどうすればいいのでしょうか? はじめに100個の正方形MCを用意してからインスタンス名をつけていくのだとおもいますがどのように書けばいいのでしょうか?
お礼
いや、なんとお礼を言ったらいいのでしょう? 本当にありがとうございます。 おかげで解決することができました。 同じ問題を解決するのにもこんなにやり方があってとても勉強になりました。 このページは永久保存版にしておこうと思います。