レイヤーに配置されたムービークリップを削除する方法について

このQ&Aのポイント
  • Flash8を使用している際に、レイヤーに配置されたムービークリップを削除する方法について教えてください。
  • シーンの切り替え時に、choice_MC上のムービークリップと同じ名前のムービークリップを深度空間に移動させて消去する方法はありますか?
  • 質問者はレイヤー上に並んだムービークリップについて、シーンの切り替え時に問題が発生しているようです。シーンを切り替えるたびに表示される不要なムービークリップを消去する方法について教えてください。
回答を見る
  • ベストアンサー

レイヤーに配置されたムービークリップを削除したい

Flash8を使っています。 シーン1とシーン2があり、それぞれのレイヤー上にMCが10個程並んでいます。シーンの切り替えはボタンで行います。 シーン1と2で必要なMCを画面上側にある選択領域(choice_MC)にドラッグするのですが、ドラッグ開始と同時にswapDepthsで深度空間に移動させ、シーンが変わっても消えないようになっています。 しかし、2つ問題点があり ● シーンを切り替えると、choice_MC上のMCと同じものが表示されてしまう。 ● choice_MC上になくてもドラッグしたMCはシーンを切り替えても表示されてしまう。 解決策として シーンを切り替えた際、choice_MC上のMCと同じ名前のMCは深度空間に移動させて消去する。 というようなことを考えていましたが、何か良い方法はないでしょうか? 何卒宜しくお願い致します。 

  • Flash
  • 回答数3
  • ありがとう数3

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

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

#1&2 です。 補足(お礼)を読ませていただいたり,ご質問を再読させていただいて, 概容がだいたいつかめました(と思うだけですが)。 次のようにされてはいかがでしょうか? 単なる提案ですよ。 ドラッグする MC(ムービークリップ) が10個あって,5個ずつ表示させるものとします。 10個のMC には,「dr_0」「dr_2」「dr_3」…「dr_9」というインスタンス名を付けたとします。 また,背景である MC1 と MC2 の中には, それぞれ同じインスタンス名である「idou_btn」というボタンを用意したとします。 --- 階層構造 -----------------------------------   _root(メインムービー)     ├ dr_0(ドラッグするMC)     ├ dr_0(ドラッグするMC)      … 略 …     ├ dr_0(ドラッグするMC)     ├ choice_MC(ドラッグエリアのMC)     ├ MC1(背景MC)     │ └ idou_btn(ボタン)     └ MC2(背景MC)        └ idou_btn(ボタン) ----------------------------------------------- --- レイヤー&フレーム構造 -------------------------  □ レイヤー 筆・・|○| ←スクリプト  □ レイヤー 筆・・|●| ←ドラッグする MC dr_0 ~ dr_4  □ レイヤー 筆・・|●| ←ドラッグする MC dr_5 ~ dr_9  □ レイヤー 筆・・|●| ←choice_MC(ドラッグエリアのMC)  □ レイヤー 筆・・|●| ←MC1 (背景ムービークリップ1)  □ レイヤー 筆・・|●| ←MC2 (背景ムービークリップ2) ----------------------------------------------- スクリプトは, 各MCやボタンには全く書かないものとします。 全ては _root の フレーム1 に 次のように↓書いて各ボタンなどの動作定義をします。 ////////////////////////////////////////////////////// // ムービークリップ dr_0 ~ 9 の動作定義 for (var i = 0; i<=9; i++) { // onPressでドラッグ開始 _root["dr_"+i].onPress = function() { this.startDrag(); }; // onReleaseでドラッグ終了 _root["dr_"+i].onRelease = function() { this.stopDrag(); }; _root["dr_"+i].onReleaseOutside = function() { this.stopDrag(); }; } // // MC1 内のボタン idou_btn の動作定義 _root.MC1.idou_btn.onRelease = function() { // MC2 を表示 _root.MC2._visible = true; _root.MC2.gotoAndPlay(1); // choice_MC との当たり判定で dr_0 ~ 4 の表示非表示を決定 for (i=0; i<=4; i++) { // もし dr_0 ~ 4 が choice_MC とヒットしていなければ if (!_root["dr_"+i].hitTest(_root.choice_MC)) { // その dr_○ を非表示にする _root["dr_"+i]._visible = false; } } // ムービークリップ dr_5 ~ 9 を表示 for (i=5; i<=9; i++) { _root["dr_"+i]._visible = true; } // MC1 を非表示 _root.MC1._visible = false; }; // // MC2 内のボタン idou_btn の動作定義 _root.MC2.idou_btn.onRelease = function() { // MC1 を表示 _root.MC1._visible = true; _root.MC1.gotoAndPlay(1); // choice_MC との当たり判定で dr_5 ~ 9 の表示非表示を決定 for (i=5; i<=9; i++) { // もし dr_5 ~ 9 が choice_MC とヒットしていなければ if (!_root["dr_"+i].hitTest(_root.choice_MC)) { // その dr_○ を非表示にする _root["dr_"+i]._visible = false; } } // ムービークリップ dr_0 ~ 4 を表示 for (i=0; i<=4; i++) { _root["dr_"+i]._visible = true; } // MC2 を非表示 _root.MC2._visible = false; }; // // ムービークリップ dr_5 ~ 9 を非表示 for (i=5; i<=9; i++) { _root["dr_"+i]._visible = false; } // // MC2 を非表示 _root.MC2._visible = false; ////////////////////////////////////////////////////// これで一応私の回答の方は完成です。 同じことばかり書き続ける(ドラッグに関して)のも大変ですし, 説明もややこしくなるので, 全てのスクリプトは _root のフレームに書くことにしました。 こういう便利で全体を把握しやすくできるようになったのは,Flash MX 以降です。 MC1 や MC2 内のタイムライン制御などのスクリプトは, それぞれの MC 内のタイムラインのフレームやムービークリップなどに書いてください。 swapDepths と ドラッグ は, フレーム移動(シーン移動も含む)と非常に相性が悪いのです。 特に,swapDepths はフレームの逆移動でとんでもないことになります。 つい最近のご質問ですが↓。 「【FLASH】swapDepthsでMCが増殖する??」 http://okwave.jp/qa2679897.html   ↑教えて!goo  ↓OKWave (同じです) http://oshiete1.goo.ne.jp/qa2679897.html ですから, swapDepths とフレームの移動はできる限り避けたいと思いましたので, #2 でも フレーム移動をなくしたのです。 そして今回も上記のようにフレーム移動は全くなしというものを考えてみました。 こうしておけば, swapDepths をする必要もありません。 また, もし swapDepths をするとしても, フレームの移動がないので大丈夫です。 少し難しそうだと思われる部分に関する参考URLを書いておきます。 「繰り返し文 for - FLASHアクションスクリプト入門編」 http://isvalid.jp/actionscriptLab/ASlesson/actionsctipt_for.html 「ドット演算子と配列アクセス演算子」 http://www.fumiononaka.com/TechNotes/Flash/FN0507001.html 「インスタンス同士で当たり判定を取る」 http://hakuhin.hp.infoseek.co.jp/main/as/hittest.html#HITTEST_01  

vita622love
質問者

お礼

sassakunさま 「swapDepths と ドラッグ は,フレーム移動(シーン移動も含む)と非常に相性が悪いのです。特に,swapDepths はフレームの逆移動でとんでもないことになります。」 アクションスクリプト初心者の私が言うのも何ですが、前回までのご回答を何度も読み返して、この点については実感致しました。 今までの考え方を白紙に戻してもう一度最初から考えてみようと思っていた矢先、まさか3回目の回答がいただけるとは思いませんでした。 それも動作は完璧です。 今まで、各ボタンやフレーム、MCに散らばっていたスクリプトがこんなにシンプルになるとは・・・。 sassakunさまの力量の深さに、感激しました。 本当に、本当にありがとうございました。 心より感謝いたします。 \(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/

その他の回答 (2)

noname#35109
noname#35109
回答No.2

#1です。 > on (press) { > this.swapDepths(_root.depth++); > this.startDrag(); > } ですから.....。。。 なぜ,深度を変える必要があるのですか? #1の回答のようにすると, シーンをまたぐわけではないので,深度を変えるという変なことはしなくて済むでしょう。 >> 以上のようにすると, >> >> > ドラッグ開始と同時にswapDepthsで深度空間に移動させ、 >> > シーンが変わっても消えないようになっています。 >> >> という工夫も最初から全く不要になります。 と最後に書いていますよね。 > MC1の中に5つほどムービクリップをおき、そのムービクリップがドラッグできるよう 全然#1で書いている意味がわかっていらっしゃらないようです。 MC1 は背景です。MC2 も背景です。 どのような構造になっているのかわからないため, 登場していない物は書けませんが,  □ レイヤー 筆・・|●| ←ドラッグするムービークリップ  □ レイヤー 筆・・|●| ←Choice_MC  □ レイヤー 筆・・|●|← シーン 1 のタイムラインが入った MC  □ レイヤー 筆・・|●|← シーン 2 のタイムラインが入った MC こういうことです。 背景が変わるだけでしたら, シーンの移動も,swapDepths も全く不要でしょう。 ドラッグするムービークリップ は MC1 の中にも,MC2の中にも存在しないので消えません。 ====================== あとになってしまい,すみませんが, 上記のこととは無関係で,スクリプトが少し変ですね。 MC1 の中の シーンを切り替えるボタンには ----------------------------------- on (release) { _root.MC2._visible = true; _root.MC2.gotoAndPlay(1); _root.MC1._visible = false; } ---------------------------------- MC2 の中の シーンを切り替えるボタンには ---------------------------------- on (release) { _root.MC1._visible = true; _root.MC1.gotoAndPlay(1); _root.MC2._visible = false; } ---------------------------------- が正解です。 真ん中の行が, _root.MC2._visible.gotoAndPlay(1); という意味不明なスクリプトになっていました。 訂正致します。

vita622love
質問者

お礼

sassakun さま 度々の回答、本当にありがとうございました。 私の説明不足と理解不足で、何度もご回答をいただくことになり大変申し訳なく思っております。 「背景」をレイヤー上に置かれているムービークリップを含めて考えてしまっていた為、不思議な質問をしてしまいました。 ドラッグするムービクリップが多すぎるという理由でシーンを分けており、背景だけが変わるわけでない、という説明をするべきでした。 回答を読ませていただくと、レイヤー上にMCを置いてシーンを切り替える方法はややこしいようなので、別の方法を考えなくては・・・と思っています。

noname#35109
noname#35109
回答No.1

質問者さまの望んでいらっしゃる回答とは違うかもしれませんが, ご質問にあるような厄介な現象が起こるので, 私なら,シーン移動はさせません。 ドラッグしたいムービークリップはおそらく 深度0 以上にあっても良い物でしょうから, シーン移動の意味は, ムービークリップより下のレイヤーの背景の変化のために必要なのだと考えます。 ですから, ドラッグするムービークリップより下のレイヤーに, 2つのムービークリップを作成して, シーンを入れ替えるのではなく, ムービークリップの表示非表示を切り替えます。 つまり, シーン 1 の背景や,シーン 2 の背景は,それぞれのMC(ムービークリップ)の中に作ってしまします。  □ レイヤー 筆・・|●| ┐  □ レイヤー 筆・・|●| │← その他のもの  □ レイヤー 筆・・|●| ┘  □ レイヤー 筆・・|●|← シーン 1 のタイムラインが入った MC  □ レイヤー 筆・・|●|← シーン 2 のタイムラインが入った MC そして, シーン 1 のタイムラインが入った MC には, 例えば 「MC1」 というインスタンス名を付け, シーン 2 のタイムラインが入った MC には, 例えば 「MC2」 というインスタンス名を付けます。 そして, MC1 の中の シーンを切り替えるボタンには ----------------------------------- on (release) { _root.MC2._visible = true; _root.MC2._visible.gotoAndPlay(1); _root.MC1._visible = false; } ---------------------------------- MC2 の中の シーンを切り替えるボタンには ---------------------------------- on (release) { _root.MC1._visible = true; _root.MC1._visible.gotoAndPlay(1); _root.MC2._visible = false; } ---------------------------------- と書いて, シーンを切り替えるのではなく, ムービークリップの _visible プロパティを切り替えます。 _visible プロパティ は表示や非表示というプロパティです。 なお, 最初は表示させたくない MC2 には, そのムービークリップ自体に, ------------------------------- onClipEvent (load) { this._visible = false; } ------------------------------- と書いておけば, 最初の最初, MC1 の何も描いていない隙間から, MC2 の一部が見えてしまうというような現象も防げます。 以上のようにすると, > ドラッグ開始と同時にswapDepthsで深度空間に移動させ、 > シーンが変わっても消えないようになっています。 という工夫も最初から全く不要になります。

vita622love
質問者

お礼

sassakun さま 「ドラッグしたいムービークリップはおそらく 深度0 以上にあっても良い物でしょうから,シーン移動の意味は,ムービークリップより下のレイヤーの背景の変化のために必要なのだと考えます。」 全くその通りなのです。つたない質問内容でここまで分かっていただき感謝しております。 早速試してみました。MC1の中に5つほどムービクリップをおき、そのムービクリップがドラッグできるよう on (press) { this.swapDepths(_root.depth++); this.startDrag(); } on (release) { this.stopDrag(); } と書きました。 MC1とMC2を切り替えると、ドラッグして深度を上げたはずのクリップが消えてしまいます。Choice_MC上にドラッグしたクリップは残しておきたいのですが・・・。 追加の質問になり、大変申し訳ありませんが、教えていただけると大変助かります。 何卒宜しくお願い致します。

関連するQ&A

  • ランダム配置のムービークリップが固定配置のムービーに被ってしまいます。

    背景にランダムで星を無数に配置して瞬かせ、その上にキャラクターのムービークリップを配置しているのですが、星のレイヤーよりキャラのレイヤーを上にもってきても、星がキャラクターに被って表示されてしまいます。星の方のムービークリップに、 n=Math.round(Math.random()*1000); this.swapDepths(n); 以上の様にスクリプトで深度の設定をランダムに設定しているのですが、キャラクターの方にはどのように設定したら星が被らない様に深度の設定ができるのかわかりません。どうかよろしくお願い致します。

  • AS2でレイヤーが優先されてswapDepthsがうまく作動してくれな

    AS2でレイヤーが優先されてswapDepthsがうまく作動してくれない。 AS2で_mcの中にポップアップするballoon_mcを入れており そのような構造の_mcを_rootに複数並べています。 ロールオーバー時に_root.getNextHighestDepth()にswapDepthsさせようとしてます。 しかしながらballoon_mcは他の_mcの後ろに行ってしまいます。 _mc自体の重ね合わせを固定すると消えてしまいます。 深度はコンフリクトはしてないはずなのですが 何故か消えてしまいます。 使っているソフトはCS5です。 分かる方いらっしゃいますか?

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

    いつもありがとうございます。ミニゲームを作っていてswapDepthsで困っています。衝突の間、ムービークリップを再前面に持って来て、そうでない時は障害物の後ろにしたいのですが、障害物のムービークリップにswapDepthsを入れ、メインムービークリップを動作させるボタンにも起き上がった時にレイヤーを入れ替えるswapDepthsをいれましたが、深度の数字で指定するとリプレイした時に新しくできたレイヤーが残ってしまいます。ムービークリップのインスタンス名の指定では、ボタンを押すたびに変わってしまいます。一度、深度を指定して移動したレイヤーを元に戻すやり方はないでしょうか?深度の数字の求め方もよく、わかりません。

    • ベストアンサー
    • Flash
  • MCを最背面に表示したい+ムービーの方向・速さを変えたい

    こんばんは。 FLASHアクションスクリプトで、以下のスクリプトを利用して、 背景にものが動いているムービーを作りたいと思っております。 ↓ライブラリにあるMCをコピーする http://hakuhin.hp.infoseek.co.jp/main/as/movieclip.html#MOVIECLIP_07 こちらのスクリプトは問題なく動作したのですが、 スクリプトの内容が把握できず、困っております。 3つのご質問がございます。 (1)質問1 シーン1の上部レイヤーに違うオブジェクトを配置しており、 その下のレイヤーに上記のMCを配置しているのですが、 再生すると上記MCの方が上レイヤーのオブジェクトより前に表示されてしまいます。 このMCを最背面に表示させたいと考えております。 (2)質問2 MCの動きをもうちょっと早くしたいと思っております。 (3)質問3 上記サンプルMCでは、左から右へ移動しているのですが、 これを、下から上へ移動させたいと考えております。 スクリプトのどの部分で操作するのか教えていただける方いらっしゃいますでしょうか? 以下、作業環境です。 ----------------------------- WinXP FLASH8 ----------------------------- どうか、よろしくお願い致します。

  • ムービークリップのヒット領域を透過部分から除きたい

    パズルの地図ピースをドラックしたいのですが、透明部分(例えば「北海道」の海の部分)までもクリックでドラックされてしまいます。MCの透明部分はヒット領域から除外したいのです。なお、ピース画像はGIF(透過)で読み込み「シンボルに変換」ではタイプをムービークリップに選んで試しています。ボタンに変換する方法しかないのでしょうか?なお当方はFLASH8です。

  • 複数のムービークリップについて

    毎度すみません。 複数のムービークリップ(以下MC)をステージに時間差でバラバラの位置に登場させたいのですが、最初で行き詰まってしまいましたのでご質問させてください。 5個のMC(1~5)をステージに配置し、インスタンス名をmc1~mc5で振っています。 スクリプトレイヤーに以下の様に記述しています。 ------------ for(i=1;i<5;i++){ var mc = this["mc"+i]; mc.num = i; } mc.num._visible = false; mc.num._alpha = 0; //MCを時間差で任意の位置に表示 var t=0; this.onEnterFrame = function(){ t++; if(t==25){ mc1._visible = true; mc1.onEnterFrame = function(){ this._y = 50; } } if(t==50){ mc2._visible = true; mc2.onEnterFrame = function(){ this._y = 100; } } if(t==75){ mc3._visible = true; mc3.onEnterFrame = function(){ this._y = 150; } } //以降、mc4、mc5は省略 } --------- --------- mc.num._visible = false; mc.num._alpha = 0; --------- の部分で、デフォルト時はmc1~5を非表示にしているつもりが、 最初から表示されてしまいます。 初心者なので、近いフラッシュを見よう見真似で作成しています。 根本的に記述法を間違えておりましたら、恐れ入りますがご指摘ください。 またもっと効率的な方法がありましたら、ご教授いただければ幸いです。 Flash8.0、ActionScript2.0で制作しています。

    • ベストアンサー
    • Flash
  • 複数のMC(ドラッグで移動可能)から等しい距離にMCを配置したい

    ドラッグで移動可能な複数のムービークリップから等しい距離の位置にムービークリップを配置したいです。 以下『複数』が3つの場合を例にします。 MC4はMC1、MC2、MC3がドラッグで移動されると、MC1、MC2、MC3への距離が等しい位置(厳密に等しくなくても良い)に移動させたいです。(結果、MC4はMC1、MC2、MC3を三角形とした際の重心点上に配置される) オーサリングツールは『ParaFla!』ActionSctiptは1.0相応で以下の様に作ってみましたが、いつまで経っても落ち着かないので改善したいです。 ※スクリプトのスペースは全角で記述。 ■MC1、MC2、MC3 _root上にMC1を深度0、[固定]で配置。 _root上にMC2を深度1、[固定]で配置。 _root上にMC3を深度2、[固定]で配置。 MC1,MC2,MC3にテキストで●を配置。 MC1,MC2,MC3に以下スクリプトを記述。 on (press){  this.startDrag(); // ドラッグを開始する } - on (release, releaseOutside){  this.stopDrag (); // ドラッグを解除する } ■MC4 _root上にMC4を深度3に配置。 MC4にテキストで○を配置し、以下スクリプトを記述。 onClipEvent (enterFrame){  long=0;  short=0;  for(i=1;i<=3;i++){   mc=eval('_root.MC'+i);   length=Math.sqrt((mc._x-_x)*(mc._x-_x)+(mc._y-_y)*(mc._y-_y));   if(long<=length){    long=length;    long_mc=mc;   }   if(short>=length||short==0){    short=length;    short_mc=mc;   }  }  _x += ((long_mc._x+short_mc._x)/2 - _x)/5;  _y += ((long_mc._y+short_mc._y)/2 - _y)/5; } 上記のようにして作成したものを以下に置きます。 http://carken.web.fc2.com/osiete/test3.html 動かしてみると、いつまでたっても、細かく動いて止まってくれません。 厳密に同じ距離でなくても良く、ある程度見た目にOKかなってところで止まるようにしたいです。 アドバイスありましたら、よろしくお願いいたします。 参考 『2つのMC(ドラッグで移動可能)から等しい距離にMCを配置したい』(http://oshiete1.goo.ne.jp/qa4328262.html)

    • ベストアンサー
    • Flash
  • MC間でMCをやり取りできますか?

    質問は初めてですがよろしくお願いします。 深度入れ替えの関係で(簡略化のため)、MCを似たような深度ずつに親MCにまとめる構造で作成してきました。 しかし、このやり方では、当初予定していた深度の移動はできますが、予定外の深度の移動が、不可能になりました。 やりたいこと _root.a.mc のような構造の中のmcというムービークリップを、 _root.b.mc の階層に移動したいのです。mcの持つ変数等も一緒に移動できるのが好ましいです。 不可能であれば、 attachMovie()、removeMovieClip()あたりを使って負荷のかかりそうなやり方で我慢しようとは思っています。 ParaFla!使用・SWF8:FLASH8相当の設定で製作中

    • ベストアンサー
    • Flash
  • 【photoshop】以前は、Ctrlを押さなくても選択レイヤーが移動

    【photoshop】以前は、Ctrlを押さなくても選択レイヤーが移動しました。 それがいつからか、 「選択レイヤー」ではなく、 表示上「マウスカーソルが上に乗っているレイヤー(フォルダ)」が移動してしまうようになってしまいました。 Ctrlを押しながらドラッグすることで、 以前のように「選択レイヤー」を移動できるのですが、 元に戻すにはどうすればいいのでしょうか。 よろしくお願い致します。

  • 横スクロール用ムービークリップ幅の限界ってあるんでしょうか?

    フォトアルバムを作成しています。 シーンにalbum_mcを配置し、スクロールボタンで動かせるように作っています。 album_mc内は画像ボタンを横並びに並べており、13個くらいまでは順調でしたが、14個目からその画像がつかめなくなりました。選択ツールで選んでも選べませんし、ドラッグして四角形を描くと通常であれば黒い線が軌跡であらわれるはずですが出ません。 シーンからダブルクリックしてalbum_mcに入っても、スクロール(album_mc内の編集範囲)は13.jpgまでしか出ず、ウインドウをドラッグして大きくし、ずらせば14.jpgを見ることはできるのですが編集することができません。 すべてを選択することはできるので、他のつかめる1-13までの画像の選択を解除してなんとかつかむことはできてボタンのスクリプトはかけたのですが、パブリッシュしてみるとマウスオーバ時に出るはずのテキストが14.jpgだけ表示されませんでした。 友人に聞いたところ、同じ経験をしたことがあって、その人の場合は背景が白だったので1枚の画像にして逃げたそうです。 私の場合背景に柄が入っておりさらに1つ1つマウスオーバーの効果をつけているのでその手で逃げることもできません。 一定以上ムービークリップが長くなる、あるいは並べると編集できなくなるのでしょうか。 どなたか解決方法をご存知の方ご教授ください。 宜しくお願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう