flash actionscriptでステージ上の複数のmcを一括で削除する方法

このQ&Aのポイント
  • flash actionscriptを使用して、ステージ上の複数のmcを一括で削除したい場合、removeMovieClip()やunloadMovie()を使う方法がありますが、30個のmcがある場合は手間がかかります。
  • 代わりに、配列を使って簡単に削除する方法があります。まず、mcを配列に格納し、それぞれのmcに対してremoveMovieClip()を実行することで一括で削除することができます。
  • 以下のようなスクリプトを使用することで、30個のmcを一括で削除することができます。 var mcArray:Array = [type1, type2, type3, ..., type30]; for (var i:int = 0; i < mcArray.length; i++) { mcArray[i].removeMovieClip(); }
回答を見る
  • ベストアンサー

flash actionscriptで、ステージ上に30コあるmcを一括で消したい

困ってます。 attachMovieで複製した、それぞれtype1、type2、type3…と名付けられたMCを、あるボタンをクリックすることですべてクリアにしたいのですが、どうすればよいのかが分かりません。。 removeMovieClip();が効かなかったので、 unloadMovie();を使って、 クリアするボタンに、 on (release) { _parent.type1.unloadMovie(); _parent.type2.unloadMovie();        ・        ・        ・ _parent.type30.unloadMovie(); } としていけば消えるのですが、 30もあるとそれが面倒くさいので、簡単に、何行かで済んでしまうようなスクリプトを教えていただきたいです。 配列を使うのかと思い、自分なりにやってみましたが、うまくいかず… どなたか、おねがいします!緊急だったりするので。。 つかっているバージョンはMXです。 上記内容で状況をご理解いただくのに情報が足りなければ、追記していきますので、よろしくおねがいします。

  • oki09
  • お礼率68% (13/19)

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

  • ベストアンサー
noname#35109
noname#35109
回答No.1

>> 緊急だったりするので。。 その緊急の状態はもう過ぎてしまったでしょうか? この質問に気づくのに遅れてしまいました。 removeMovieClip(); は、 深度(レイヤーのような上下関係)が正の数であるムービークリップしか消せません。 ステージ上に手動で用意したものの深度はすべて負の数です。 duplicateMovieClip や MovieClip.attachMovie などのスクリプトで、複製または生成された物の深度は普通、正の数です。 だから、removeMovieClip はスクリプトによって複製や生成されたムービークリップを消すものだと思うと良いと思います。 でも、MovieClip.swapDepths (ムービークリップの深度を変えるスクリプト) で深度を正の数に持って行けば、removeMovieClip でも消せます。 しかし今回の場合は面倒くさくなるだけだと思うので、説明では省略します。 >> 簡単に、何行かで済んでしまうようなスクリプトを教えていただきたいです。 これ↓で良いのではないでしょうか(コピペ可)。 ----------------------------------- on (release) { for (var i = 1; i<=30; i++) { _parent["type"+i].unloadMovie(); } } ----------------------------------- わざわざ配列を作らなくても、単なる for文 で良いと思います。 for(変数の初期値; 値の範囲; 次の値){ } 変数i(初期値1) を 30 になるまで、1ずつ加えていきながら、{ }内を繰り返し計算するという文です。 [ ] の名前は、配列アクセス演算子ですが、配列を作らなくても使用可能です。 これを使うと、インスタンス名や変数などを、動的に設定,取得できます。 またこの演算子を使用してオブジェクトのプロパティにアクセスすることもできます。 _parent["type"+i].unloadMovie(); の部分ですが、意味合いが変わりますけど、 _parent["type"+i]._visible = false; でも、 _parent["type"+i]._alpha = 0; でも、非表示にはできます。 非表示にしたものを再表示させたいときには、こちらの方が便利です。 それぞれ、 _parent["type"+i]._visible = true; と、 _parent["type"+i]._alpha = 100; で復活します。 _visible = false の場合は、非表示状態でボタンとしての機能も失われてしまいます。 ボタンの機能だけは残して、表示だけを非表示にしたい場合は、 _alpha = 0 で消す方が良いでしょう。 緊急の状態をもう過ぎてしまったかもしれませんが、一応回答しておきました。

oki09
質問者

お礼

丁寧なご回答ありがとうございました! こちらに質問させていただいた後、4時間くらいネットで調べたり本をあさったりして、もしかしてこれでいける?と思ってやって自己解決出来たのが、まさに、sassakunさんのおっしゃった「for文」でした。 ご報告遅れてしまいスミマセン… 他にもいろいろな解決法を提示くださって、感謝です。 _alpha = 0でボタン機能を残す→なんていうのは、あ~そういえばそうだな、と納得してしまいまいた。 聞くとわかるけど、思い付かないです。。(常識なの?) ここで〆切らせていただきます。 どうもありがとうございました。

関連するQ&A

  • actionscript2.0でMCの切り替えなど

    Flash初心者で勉強中の身なのですがどうか質問させてください。 根本的に間違っていたりできないことをやろうとしていたら申し訳ないです。。 その際にはこう改変した方がいいとのご指示をご教示頂きたいです。よろしくお願いいたします。 attachMovieを使ってライブラリ内のMCをステージに呼び出し、そのMCを押す度にそのMCを切り替えたいと考えています。 ライブラリにはa1,a2,,,a5、b1,b2,,,,b5,c1,d1,e1…という識別子をつけたMCを用意しています。 a-eの横幅は80×80です。 20ずつ間を空けて○1のMCを横一列に配置しました。 _root.attachMovie("a1", "a1",1, {_x: 100, _y: 100}); _root.attachMovie("b1", "b1",1, {_x: 200, _y: 100}); _root.attachMovie("c1", "c1",1, {_x: 300, _y: 100}); _root.attachMovie("d1", "d1",1, {_x: 400, _y: 100}); _root.attachMovie("e1", "e1",1, {_x: 500, _y: 100}); このMCを押すと、MCが数字の大きいものに切り替わる(b1を押すとb2のMCに…で5まで)ようにしたいので、 ひとつひとつを下記のscriptで記述しました。 _root.attachMovie("b1", "b1",1, {_x: 200, _y: 100}); b1.onPress=function(){ b1.removeMovieClip(); _root.attachMovie("b2", "b2",1, {_x: 200, _y: 100}); b2.onPress=function(){ b2.removeMovieClip(); _root.attachMovie("b3", "b3",1, {_x: 200, _y: 100}); b3.onPress=function(){ b3.removeMovieClip(); _root.attachMovie("b4", "b4",1, {_x: 200, _y: 100}); b4.onPress=function(){ b4.removeMovieClip(); _root.attachMovie("b5", "b5",1, {_x: 200, _y: 100});}}}} これをa-e同じことを繰り返しています。 ここからが問題なのですが、 ここで例えば a2,b5,c1,d3,e1 という風に適当に押されてMCが切り替わり、整列させるボタンが押された時、 その数字を参照して 縦に20pxずつ空けながら b5 (空行/4があった場合の行) d3 a2 c1(20pxの空白)e1 と並べ替えたいと思っています。 つまり、a-eが現在どの数字(○1,○2..)なのかを調べ、その数字の若い方から順に縦に配置させたいと考えています。 また、上のc1,e1のように1の数字のMCが2つ以上あった場合は、同じ行に20pxずつ空けて横に配置していきたいのです。 その調べた数字の順に縦と横に並べ替える(新たにステージ上に配置し直す)というルール付けをどういうscriptを書けば上手く行くかが自分ではどうにも分からず、ここから進めない状態です。。 誰がどんな回数押したとしてもそれに準じた整列をして欲しいのですが、そのやり方があるようでしたらどうかご教示頂きたいです。 また、上記の私の書き方では難しいようでしたらそこから改変したものをお教え願いたいです。 分からないことばかりで申し訳ないのですが、何卒よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • flashのMCの中にMCを入れてその中のボタンでシーンを移動したいのですができません

    flashの シーン1で大元になる5つのMCで構成された大元のMCにはonClipEvent (enterFrame)のスクリプトを記述しています。 その5つのMCの中、それぞれに、ボタンがあります。そのボタンはシーン1からシーン2に飛ばすアクションをつけているのですが、まったく反応しません。 なぜか、同一シーンのフレーム移動は反応するのですが。ボタンの記述は下記です。 on (release) { _parent._parent.gotoAndPlay("work", 1);

    • ベストアンサー
    • Flash
  • FlashのActionScript詳しい方お願いします

    Flashで波紋が広がっていくようなムービーのスクリプトなのですが、うまく行きません。 スクリプトが間違っているのだと思うのですが、一応本を参考に同じように入力したつもりですのでどこが間違っているのかが分かりません。 デバックしたら下のようなメッセージが出るのですが、「;」をどこかに入れたらいいのでしょうか? 『 シーン = シーン 1, レイヤー = mouse, フレーム = 1 : 行 9:';' が必要です。 onClipEvnet(mouseMove) { 』 ----------------------------------------- 以下が記述したスクリプトです。 onClipEvent(load){ if(_name== "mc"){ max=10;//複製する個数 for(i=0; i<max; i++){ this.duplicateMovieClip(i,100+i);//複製 } } } onClipEvnet(mouseMove) { if(_name=="0"){//一つ目のmcはマウスの座標とする _x=_parent._xmouse; _y=_parent._ymouse; }else{//それ以降は自分の名前から-1引いたインスタンス名の座標を取得する _x=_parent[int(_name)-1]._x; _y=_parent[int(_name)-1]._y; } updateAfterEvent(); }

  • Flash/オブジェクトの指定のしかた

    いつもお世話になっております。 FlashでActionScriptを使って、 異なるオブジェクトを、同じメソッドで 連続的に処理する仕方について質問です。 やりたいこと・・************************* オブジェクトをいくつか複製して、 Resetボタンをクリックすると、 複製したオブジェクトが全てきえる、 というスクリプトを組みたいと考えています。 ************************************** 具体的には以下のように、 duplicateMovieClip()でオブジェクトを複製します。 次に、resetボタン(ボタンオブジェクト)に、 removeMovieClip()メソッドで複製したオブジェクトを 削除します。 メソッドは以下のようにしています。 一気にすべてを消したいために、 For文でremoveMovieClip()メソッドを 実行しようとしています。 removeMovieClip()メソッドを実行させる、 オブジェクトの指定に、 変数を使おうとしましたが、 とれませんでした。(以下参照) function removePoint() {  i = 1;  for (i = 1; i < pointFlg+1; i++){   RemoveObj = "newMc" + i;   _root.RemoveObj.removeMovieClip();  } } 異なるオブジェクトでメソッドを、一気に実行させる、 よい方法はご存知ないでしょうか? サンプル*********************************** function DuplicatePoint(){  pointFlg ++;  var newMcName = "newMc" + pointFlg;  var newLevel = pointFlg;  this.duplicateMovieClip(newMcName, newLevel);  _root.cursol.swapDepths(999);  _parent[newMcName]._x = _parent._xmouse;  _parent[newMcName]._y =_parent._ymouse; } function removePoint() {  i = 1;  for (i = 1; i < pointFlg+1; i++){   RemoveObj = "newMc" + i;   _root.RemoveObj.removeMovieClip();  } }

  • unloadMovie();でMCが消えない

    ロールオーバーした時リンケージを設定している画像を表示して、ロールアウトで画像を消すボタンを1つの画面にたくさん置くflashを作っていますが、うまく動かず困っています。スクリプトは以下をボタンに記述しています on(rollOver){ _global.area="key_word"; } on(rollOver){ var x=_root._xmouse; var y=_root._ymouse; var namearea="name-"+area; this.attachMovie(namearea, namearea, 0, {_x:x, _y:y}); } on(rollOver){ namearea.unloadMovie(); } 以上ですが、 on(rollOut){ namearea.unloadMovie(); } の部分が上手く動かず、ロールオーバーで表示された画像がロールアウトしてもずっと表示されてしまいます。レベル(階層?)がいまいちわからなかったので、_root.namearea.unloadMovie(); や this.namearea.unloadMovie(); で試してみたのですが結果は同じでした。 インスタンス名を変数にしているのは、このようなボタンが沢山あるので、一箇所の修正で表示させる画像を替えれるようにしたかったので、このような形にしています。winXPでflash MX(ver.6)を使用しています。 よろしくおねがいします。

    • ベストアンサー
    • Flash
  • MCの重なり順

    今、ボタンをクリックするごとにattachMovieでステージ内にMC(ボールのアニメーション)を配置するというものを作っています。 ステージ内に設置したカラーバー(スライダー?)からsetRGBでそれぞれのMCに色をつけています。 そこで、それを応用して背景も色を変えられればいいなぁと思い、背景部分をMCにして背景ボタンを作り、 色を選択して背景ボタンを押すと、背景の色が変わるようにしました。 これで背景の色を自由に変えることができるようにはなったのですが、 クリックして出現させたボールMCの上に背景が重なってボールが見えなくなってしまいます。 きっとこれは深度に関係しているんだろうとは思いましたが、背景もattachMovieで複製させているため、どうしていいかわかりません。 もしくは、背景をMCにしないで色を変える方法があればいいのかとも思うのですが…。 環境はXP、FlashMXです。 どなたか分かる方、解答よろしくお願いします!!

    • ベストアンサー
    • Flash
  • FlashのMCに複数の動作をつけるためには

    ムービークリップに スクリプト(以下(1)(2))をつけたいのですが、 そのスクリプトを別々(フレームやムービークリップ)に設定しているためか、 思うような動きを出すことができません。 同じフレームにスクリプトを書くことができれば 解決できると思うのですがそれができなくて・・・。 私の考えるイメージは以下の通りです・・・。 (1)フレーム上に赤の四角□(R_mc1、R_mc2)と白の四角□(W_mc1、W_mc2)のムービークリップ(MC)があります。 (2)赤のMCはドラッグすることができ、ドラッグしたMCは他のMCに重なると常に上に表示される。 (3)ドラッグした赤のMCが白のMCにヒットすれば(重なれば)、赤から黄へと色が変わる。  (そのために、赤のMC内のタイムラインには、フレーム1に赤、フレーム2に白、フレーム3に黄色の四角□を置いて、ヒットすればMC内のフレーム3にいくようにする。) (4)赤の四角□をドラッグせずにクリックだけをした場合は、MC内のフレーム2に行き、赤から白に色が変わる。 (5)リセットボタンをクリックすると、赤や黄のMCが元の位置に戻る。(最初のMCに戻る) 環境は、Flash Professional CS5.5 Action Script 2.0   Flash Player10 です。 以下はフレームに書いたスクリプト(1)です。 //--------------------------- //深度カウント用変数を用意 var dep_cnt:Number = 1; //変数 i に 1~2を入れながらループ for (var i:Number = 1; i<=2; i++) { //★「R_mc○」内の再生を停止 this["R_mc"+i].stop(); //★「R_mc○」内の変数 target_mc に「W_mc○」の参照を代入 this["R_mc"+i].target_mc = this["W_mc"+i]; //「R_mc○」押下時に関数 dragMC を実行 this["R_mc"+i].onPress = dragMC; //「R_mc○」を放した時に関数 dropMC を実行 this["R_mc"+i].onRelease = dropMC; //「R_mc○」をMC外で放した時にも関数 dropMC を実行 this["R_mc"+i].onReleaseOutside = dropMC; } //関数 dragMC の定義 function dragMC():Void { //深度カウント用変数をカウントアップ dep_cnt++; //押下されたMCをその深度に移動 this.swapDepths(dep_cnt); //押下されたMCのドラッグを開始 this.startDrag(); //★マウスが動く度に関数 watchHitW_mc を実行 this.onMouseMove = watchHitW_mc; } //関数 dropMC の定義 function dropMC():Void { //放されたMCのドラッグを終了 this.stopDrag(); //★マウスが動く度に関数 watchHitW_mc を実行するのを解除 delete this.onMouseMove; } //★関数 watchHitW_mc の定義 function watchHitW_mc():Void { //★ドラッグ中のMCがそのMC内の変数 target_mc に // 代入したMCとヒットしていれば if (this.hitTest(this.target_mc)) { //★ドラッグ中のMC内をフレーム3で停止 this.gotoAndStop(3); } else { //★それ以外はドラッグ中のMC内をフレーム1で停止 this.gotoAndStop(1); } } //--------------------------- 以下はR_mc1とR_mc2自体に書いたスクリプト(2)です。  R_mcをクリックしたときに白色になるようにR_mc 内のフレーム2(白い四角□)に行くようにしてあります。 (本当は、上記に示したフレームに書くスクリプト(1)に加えて書かなければいけないのだと思うのですが、その書き方がわからないので、R_mc自体に書いています。) //--------------------------- on (release) { this.gotoAndPlay(2); } //--------------------------- 以上のようなスクリプト(1)(2)にすると、赤のMC(R_mc1、R_mc2)をドラッグすると、スクリプト(1)ではなく、スクリプト(2)が優先されて、赤から黄にしたいのに、白に変わってしまうのです。 上記の私の考えるイメージ(1)~(5)が実行できるようなフレームに書くスクリプトを教えてください。 どうぞよろしくお願いいたします。 補足 リセットボタンには以下のスクリプトを書いてあります。    リセットボタンは同じフレーム内にスクリプトを書かずに、リセットボタン自体に書いてもかまいません。 //------------------ on (release) { //変数 i に 1~2を入れながらループ for (i=1; i<=2; i++) { //「R_mc○」を削除 this["R_mc"+i].removeMovieClip(); } gotoAndStop(1); gotoAndStop(2); } //------------------

    • ベストアンサー
    • Flash
  • Flashでボタンをつくっているのですが、actionscriptをつ

    Flashでボタンをつくっているのですが、actionscriptをつかってボタンをクリックさせたいのですが、アクションパネルのところに「現在の選択範囲にアクションを割り当てることはできません。」と表示されてしまいます。 参考書に附属されているflaをみたところ、Actionscript1.0、2.0となっているのですが、作成しているのはActionscript3.0で作っています。 ====== on (release) { /*↑ボタンが押されて離されたら*/ _parent.gotoAndPlay("about"); /*↑「about」ラベルへ移動*/ } ====== このようなscriptをいれたいのですが、うまくいきません。 ムービークリップでボタンを作るまではできました。その後、何かが抜けているのかして上記のようなエラーがでます。 flash初心者のため、どういう風に書いて質問させていただいたらよいのかわからないのですが、参考flaと見比べたときに「シンボル定義」のなかにあるムービークリップがひとつたりませんでした。(このムービークリップは「navigation」というものですのでそれがありません。) 質問するにはあまりにも情報が少ないかもわかりませんが、何卒ご教授いただけると大変助かります。 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • swapDepths について

    ※FLASH 5 を使っています。 attachMovie で複製した MC での swapDepths について教えて下さい。 まず attachMovie をする為の素材を作ります。 丸い図形を作り、それをボタンにし 『 ボタン1 』 とします。 そのボタンを MC にして 『 MC1 』 とします。 『 MC1 』 をリンケージで識別子を 『 MARU 』 とします。 『 MC1 』 に配置された 『 ボタン1 』 に下記 AS を書きます。 on (press) { this.swapDepths(_root.HAICHI.maxdepth++); startDrag (""); } on (release) { stopDrag (); } 別に配置用の空の MC を作り、ステージ上に配置し 『 HAICHI 』 と名前を付けます。 更にステージ上に 『 ボタン1 』 を配置して、そのボタンに下記 AS を書きます。 on (release) { i ++; _root.HAICHI.attachMovie( "MARU", "MARU"+i, _root.HAICHI.maxdepth++ ); _root.HAICHI["MARU"+i]._x = 50; _root.HAICHI["MARU"+i]._y = _ymouse; } これでボタンを押すと丸い形の MC が複数配置できるようになります。 また複製された MC のうち背後にある MC をクリックすると、その MC が最前面に配置 されるようになります。 ここまでは良いのですが、新たに 『 MC2 』 を作り、そこに 『 MC1 』 を配置します。 つまり『 MC2 』 の中に 『 MC1 』 が配置され 『 MC1 』 の中に 『 ボタン1 』 が配置 されている状態です。 更に 『 MC1 』 のリンケージを解除して、『 MC2 』 にリンケージで識別子を 『 MARU 』 とします。 このようにした場合、ボタンを押すと MC の複製は出来るのですが、MC をクリックしても 最前面には出て来ません。 ムービークリップのムービークリップでは swapDepths は利かないのでしょうか? MC にも AS を書きたいので、どうしても入れ子にしなければなりません。 何か良い方法がありましたら教えて頂けますよう宜しくお願い致します。

    • ベストアンサー
    • Flash
  • duplicateMovieClipしたMCをSharedObjectで保存、読み込みたい

    【やりたいこと】 duplicateMovieClipで何個も複製したムービークリップをSharedObjectで保存し(て読み込み)たい。 【わからないこと】 ユーザーが何個複製するかわからないものをi変数でカウントして それをSharedObjectで保存しようとしているが、 ユーザーが何個複製するかわからないMCに対する 一括命令文?がうまく書けない。 【現状】 まず、MC_printというMCの中にisuというMCがあります。 そのisuの上に空ボタンを置いて、以下のような スクリプトを書きました。 on (press) { _root.MC_print.isu.duplicateMovieClip("isu"+i, i++); //isuというMCをクリックするたびに複製していく _root.MC_print["isu"+i]._x = 500; //重なるので移動させてる } そして、保存ボタンに on (press) { _root.Save_Point(); } と書いていて、 SharedObjectインスタンスの生成は mySharedObject = SharedObject.getLocal("xypoint","/"); としています。 そして肝心のfunction命令文を function Save_Point() { mySharedObject.data["isu"+i._x] = _root.MC_print["isu"+i]._x; mySharedObject.data["isu"+i._y]= _root.MC_print["isu"+i]._y; } としています。 が、動きません。 理由は自分でもなんとなくわかるのですが、 複製されたMCが何個複製されたかわからない。 iの変数がちゃんと共有されてないんじゃないかと思っています。 が、_global変数にしても「isu1」「isu2」という風に インスタンス名を_nameで調べてテキストボックスで確認しても 複製はされてるが、このfunction命令文だとそのインスタンス名毎に (全てに)命令されてないってことですよね・・・。 for文とかを使うんでしょうか。でも何個複製されるか わからないし・・・。よくわかりません・・・。 環境はWindowsXP、FlashMXです。 MX以前の時代から突然またフラッシュを触り始めたので 新しいスクリプトなどはまったくわかりません。 なにかヒントでもいただければ幸いです。どうぞよろしくお願いいたします。

専門家に質問してみよう