- ベストアンサー
MCの複製方法
MCを三つ用意し各MCに、MC000、MC001、MC002と名前をつけ、縦に三つ並べ、下記のようにしました。 ● ● ● これをASを書いて、 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● for (i=1; i<=6; i++) { _root.MC000.duplicateMovieClip(["MC000"+i], i, {_x:_root.MC000._x+(i*50)}); _root.MC001.duplicateMovieClip(["MC001"+i], 10+i, {_x:_root.MC001._x+(i*50)}); _root.MC002.duplicateMovieClip(["MC002"+i], 20+i, {_x:_root.MC002._x+(i*50)}); } としたのですが、 一つのMCから ● をASを書いて、 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● とすることはできますでしょうか? 複雑になりすぎない程度に方法がありましたら、ご教授いただけたらと思います。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
(この回答の後半は気にしないでください。) どこの部分でのご質問かが,少々わかりにくいです。 大筋は #1 の方の方法で良いと思うのですが, 私は,もっと初歩のご質問をされているのかもしれないと思ったのです。 まず,#1 の方と同様に思う点ですが, MovieClip.attachMovie メソッド を使った場合は, 最初の本人(MC000)がステージ上に存在しないため, スクリプトはシンプルになりますが, ご質問のように, MovieClip.duplicateMovieClip メソッド を使った場合は, 最初の本人(MC000)がステージ上に存在していますから, 少しスクリプトが複雑になります。 しかし, 複雑になると言っても大したことはありません。 最初に手作業で「MC001」と「MC002」を作った部分を, ActionScript で作ってしまえば良いだけのことです。 ステージ上にインスタンス名「MC000」というムービークリップを1つ作って, _root のフレームのスクリプトに次のように書けばできあがりです↓。 //////////////////////////////////////////////////////////////////////// // 手作業で MC001 と MC002 を作った部分 for (i=1; i<=2; i++) { _root.MC000.duplicateMovieClip("MC00"+i, 10*i, {_y:_root.MC000._y+(i*50)}); } // ご質問で書かれている部分(一部変更) for (i=1; i<=6; i++) { _root.MC000.duplicateMovieClip("MC000"+i, i, {_x:_root.MC000._x+(i*50)}); _root.MC001.duplicateMovieClip("MC001"+i, 10+i, {_x:_root.MC001._x+(i*50)}); _root.MC002.duplicateMovieClip("MC002"+i, 20+i, {_x:_root.MC002._x+(i*50)}); } //////////////////////////////////////////////////////////////////////// 一部変更 と書いているのは, duplicateMovieClip の第一引数(パラメータ)["MC000"+i] などの, [ ] が不要だと思うので取っただけです。それ以外に変更はありません。 シンプルに考えて, 上記のようにするのが簡単だと思いますよ。 あと, 検証のために,「MC000」というムービークリップ自体には, --------------------- on(release){ trace(this._name); } --------------------- というスクリプトを書いておいて, 「制御」→「ムービープレビュー」してみて, 表示された 18個の● をクリックしてみると, インスタンス名が指定どおり付いているかどうかがわかると思います。 なお, for文を二重にすると, ご質問で書かれている部分の3行が1行になります↓。 //////////////////////////////////////////////////////////////////////////// // 手作業で MC001 と MC002 を作った部分 for (i=1; i<=2; i++) { _root.MC000.duplicateMovieClip("MC00"+i, 10*i, {_y:_root.MC000._y+(i*50)}); } // ご質問で書かれている部分(大分変更) for (j=0; j<=2; j++) { for (i=1; i<=6; i++) { _root["MC00"+j].duplicateMovieClip("MC00"+j+i, j*10+i, {_x:_root["MC00"+j]._x+(i*50)}); } } //////////////////////////////////////////////////////////////////////////// 3行くらいだとどっちでも良いですが, もっと増えた場合は,for文ループを二重にする方が良いかもしれません。 こういうときに配列アクセス演算子 [ ] を使うのです。 この回答の冒頭で, MovieClip.attachMovie メソッド について書いてしまいましたので, その件についての参考URLです↓。 「ムービークリップの複製_Flash - FreeStyleWiki」 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_Flash 「attachMovie (MovieClip.attachMovie メソッド)」 http://livedocs.macromedia.com/flash/8_jp/main/00002440.html **************************************************** ※大変申し訳ございません。 以下,質問者様ならびに#1の回答者様, 無視してくださってかまいません。 #1の回答者様に質問があるのですが...。 //コピー元のムービークリップを削除する clip_org.swapDepths( 100 ); this.createEmptyMovieClip( "eraser" , 100 ); removeMovieClip( eraser ); と書かれている部分にすごく疑問があります。 あるレイヤー上に手動で作成したムービークリップは, 深度が-(マイナス)だから消せないだけですから, 深度を 0 以上にしてやると消せるのではないでしょうか? つまり, clip_org.swapDepths( 100 ) をしている時点で clip_org の深度は 0 以上ですから, 即, removeMovieClip( clip_org ); で消せると思うのですが...。 つまり ------------------------------ clip_org.swapDepths(100); removeMovieClip(clip_org); ------------------------------ もしそうでなければ, 私がかなりな数回答してきたことが嘘になってしまいます。 消せているつもりで,実は残っているとか...??? (かなり冷や汗状態です。) 「QNo.2898729 ムービークリップを削除したい 」 http://okwave.jp/qa2898729.html 「QNo.1388866 FLASHの非表示」 http://okwave.jp/qa1388866.html その他, そう答えたのは数知れず….....。 すごいアセアセ状態です。 回答者どうしが答え合うのは, このコミュニティのルール違反だということはわかっていますが, 新質問スレッドを立ち上げるのも変かと思いまして, このようなところで質問させていただきました。すみません。 この **** 以下は, 質問者様も,#1の方も,当然無視してくださってかまいません。 私自身が,動揺でどうしよう? というものです。 ***以下,すみませんでした。
その他の回答 (1)
- DPE
- ベストアンサー率85% (666/776)
”縦に3個配置する”動作を”6回繰り返す”と考えてみてはいかがでしょう。 等間隔に配置するのであれば、for ループを二重にすると、ループカウンタを利用して位置を算出できます。 コピー元のムービークリップを配置してください。 この場所が、コピーを配置する際の基点(図形全体の左上になるムービークリップの位置)になります。 仮に、コピー元のインスタンス名を” clip_org ”とします。 これを 18 個(縦3個×横6個)、等間隔に配置しながらコピーするスクリプトは、大体、次のようになります。 このスクリプトは、コピー元を配置したタイムラインのフレームに設定してください。 Flash Player 6 以降で動作します。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) //配置する際の基準になる座標 org_x = clip_org._x; org_y = clip_org._y; //横および縦方向の間隔と配置する個数 margin_h = 20; margin_v = 10; h_cnt = 6; v_cnt = 3; //コピーの総数:深度の決定に使用 copy_cnt = 0; //位置の初期化に使う変数 init_obj = new Object(); copy_name = ""; //ムービークリップを複製 for( i = 0 ; i < h_cnt ; i++ ) { for( j = 0 ; j < v_cnt ; j++ , copy_cnt++ ) { //位置とコピーの名前を決める init_obj._x = ( clip_org._width + margin_h ) * i + org_x; init_obj._y = ( clip_org._height + margin_v ) * j + org_y; copy_name = "clip" + i + j; //ムービークリップを複製 clip_org.duplicateMovieClip( copy_name , copy_cnt , init_obj ); } } //コピー元のムービークリップを削除する clip_org.swapDepths( 100 ); this.createEmptyMovieClip( "eraser" , 100 ); removeMovieClip( eraser ); 複雑そうに見えますが、for ループの前の変数は配置を決めるのに使う変数です。 コピーを並べる時の間隔は、変数 margin_h (横方向)と margin_v (縦方向)に入っています。 また、個数は変数 h_cnt (横方向)と v_cnt (縦方向)に入っています。 作品に合わせて変更してください。 二重になっている for ループが、このスクリプトの肝です。 冒頭にも書きましたように”縦に3つ配置する”動作を”6回繰り返す”と考えますが、ループを組む時は、内側の j のループが”縦に3つ配置する動作”になります。 この j のループを外側の i のループで6回繰り返すことで、”縦に3つ配置する”動作を”6回繰り返す”という意味になります。 ****************** コピーは 18 個作られます。 すると、余分になったコピー元のムービークリップをどうするかが問題になります。 単純に見えないようにしておくだけでいいのなら、for ループの後にあるスクリプトを //コピー元を非表示にする clip_org._visible = false; に変更してください。 不要になったものがステージにあるなんてスッキリしない、という場合の作例が、上記のスクリプトです。 Flash ではスクリプトで動的にムービークリップを挿入できますが、その際に”深度”というパラメータを指定します。 深度とは重ね順のことで、ムービークリップはもちろん、ボタン・グラフィックインスタンスや描画ツールで描いた絵の1つ1つに、いずれとも重複しない深度が割り当てられています。 スクリプトでムービークリップを挿入する時には、必ず深度を指定します。 この時、既に他のインスタンスや絵などが占有している深度を指定すると、その深度にあったものが挿入したムービークリップに置き換えられてしまいます。 この特徴を逆に利用すると、ステージに配置したムービークリップをスクリプトで削除することができます。 ステージにあるムービークリップを消すには、次のように考えます。 スクリプトで配置したムービークリップは removeMovieClip で削除できますが、このメソッドは最初からステージに配置されていたものには通用しません。 そこで、removeMovieClip で削除できるように、何か代わりのムービークリップをスクリプトで作ります。 上記のスクリプトでは、createEmptyMovieClip で空っぽのムービークリップを作っています。 このムービークリップを挿入する時に、消したいムービークリップが占有している深度を指定します。 すると、深度の衝突が起こり、元のムービークリップが新しく作られた空っぽのムービークリップに置き換えられます。 あとは removeMovieClip で空っぽのムービークリップを削除すると、不要なものは全て消えるというわけです。 ただし、removeMovieClip は負の深度が割り当てられているものを削除することができません。 深度は -16384 から 1048575 の間で割り当てられますが、最も下の -16384 は _root が占有し、ステージに配置したものにはそのすぐ上の -16383 から順に深度が割り当てられます。 つまり、ステージにあるものは、たいていは負の深度を持っています。 深度の衝突を利用してムービークリップを置き換えたとしても、これが負の深度を持っている限りは removeMovieClip で削除できません。 そこで、まず元のムービークリップの深度を swapDepths で正の深度に変更します。 変更後の深度と同じ深度に空っぽのムービークリップを挿入すると、元のムービークリップが空っぽのムービークリップに置き換えられて消えます。 こうして入れ替わった空っぽのムービークリップは正の深度を持つので、removeMovieClip で削除することができます。 ------------------------------------------------------------------- 話が逸れてしまいましたが。 今回は縦→横と見て考えましたけれど、”横に6個配置する”動作を”3回繰り返す”と考えてループを組むこともできます。 コピー元のムービークリップは、基準点が左上または中央にあるものとして考えています。 これ以外の場所を基準点にしている時は、位置の計算方法にご注意ください。 コピーの名前はとりあえず、clip○△という形で付けています。 深度を決めるために変数 copy_cnt で個数を数えていますので、通し番号にしたければ、名前を決める copy_name = "clip" + i + j; ↑この部分を copy_name = "clip" + copy_cnt; に変更してください。 clip + 0 からの通し番号で命名されるようになります。 コピーしたものに for ループを使って onRelease などを定義する時は、通し番号で付いている方が便利だと思います。 長くなってすみませんでした。 不明な点がありましたら補足してください。
お礼
だいぶ苦戦しまして、お礼が遅くなりました。 詳細なご説明で大変参考になりとても勉強になってます。 まだ完了ではないですが、大分理解できてきました。 書き込みありがとうございました。
お礼
だいぶ苦戦しまして、お礼が遅くなりました。 詳細なご説明で大変参考になりとても勉強になってます。 まだ完了ではないですが、大分理解できてきました。 書き込みありがとうございました。