• ベストアンサー

Flashでムービークリップを常に上に表示する方法

Flashの初心者で、次のことにつまずいています。 初心者のためにわかりやすく教えていただけたら助かります。 複数のムービークリップ(MC)があるとします。 その中のMCの1つをドラッグして他のMCに重なったときに、ドラッグしたMCが常に他のMCの上に表示されるようにしたいのですが・・・。 どのMCをドラッグした場合でも、他のMCの上に表示されるようにしたいです。 Flashのバージョンは、CS5.5で、アクションスクリプト2.0を使用しています。 どうぞよろしくお願いいたします。

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

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

Flash CS 5.5 は良いとして 今回のご質問での ActionScript 2.0 とは微妙ですね。。。 普通は 「ActionScript 2.0 を使用→Flash Player 7 以上用 SWF をパブリッシュ」 というのが一般的なのですが ActionScript 2.0 は場合によって Flash Player 6 でも 動作するのです。 今回質問されているものの場合 ちょうどその境界部分の辺に関係する箇所があって Flash Player 6 用と Flash Player 7 以上用 SWF とでは 違って来る部分が出て来るので どう回答すべきか悩むところです。 (具体的には getNextHighestDepth が使えるか使えないかという違いがあります。) しかしまあ, 字数もそんなに多くはならないと思うので Flash Player 6 用 SWF をパブリッシュする場合と Flash Player 7 以上用 SWF をパブリッシュする場合との 両方のスクリプト例を回答することにします。 大雑把に言えば Flash Player 6 用でも Flash Player 7 以上用でも どちらにしても一般的によく使われている方法の内容は同じで マウスプレスした(またはマウスアップした) MC の深度を その MC が存在する階層での一番上の深度に swapDepths させれば良いわけです。 この説明では Flash Player 6 用でも 7 以上用でも どちらにしてもとりあえず ドラッグする4つのMCに全て違うインスタンス名を付けます。 どれがどれでも良いので ステージ上のドラッグする4つの MC を1つずつ選択して プロパティインスペクタより,例えば 「drag_mc0」「drag_mc1」「drag_mc2」「drag_mc3」 というインスタンス名を付けるとします。 その場合の Flash Player 6 用 SWF をパブリッシュする場合の 4つの MC が存在する タイムライン の "フレーム" に書くスクリプト例です。 (この例では "MC 自体" にはスクリプトは一切書きません。)   ◎ Flash Player 6 以上用 SWF のスクリプト //------------------------------------ //深度カウント用変数を用意 var dep_cnt:Number = 0; //変数 i に 0~3 を入れながらループ for (var i:Number = 0; i<=3; i++) { //「drag_mc○」押下時に関数 dragMC を実行 this["drag_mc"+i].onPress = dragMC; //「drag_mc○」を放した時に関数 dropMC を実行 this["drag_mc"+i].onRelease = dropMC; //「drag_mc○」をMC外で放した時にも関数 dropMC を実行 this["drag_mc"+i].onReleaseOutside = dropMC; } //関数 dragMC の定義 function dragMC():Void { //深度カウント用変数をカウントアップ dep_cnt++; //押下されたMCをその深度に移動 this.swapDepths(dep_cnt); //押下されたMCのドラッグを開始 this.startDrag(); } //関数 dropMC の定義 function dropMC():Void { //放されたMCのドラッグを終了 this.stopDrag(); } //------------------------------------   ◎ Flash Player 7 以上用 SWF のスクリプト //------------------------------------ //変数 i に 0~3 を入れながらループ for (var i:Number = 0; i<=3; i++) { //「drag_mc○」押下時に関数 dragMC を実行 this["drag_mc"+i].onPress = dragMC; //「drag_mc○」を放した時に関数 dropMC を実行 this["drag_mc"+i].onRelease = dropMC; //「drag_mc○」をMC外で放した時にも関数 dropMC を実行 this["drag_mc"+i].onReleaseOutside = dropMC; } //関数 dragMC の定義 function dragMC():Void { //押下されたMCを最高深度に移動 this.swapDepths(getNextHighestDepth()); //押下されたMCのドラッグを開始 this.startDrag(); } //関数 dropMC の定義 function dropMC():Void { //放されたMCのドラッグを終了 this.stopDrag(); } //------------------------------------   上のスクリプト例では2例とも MCを押した時点で(関数 dragMC 実行時に) そのMCの深度を最高深度に移動させていますが, MCを放した時点で(関数 dropMC 実行時に) そのMCの深度を最高深度に移動させても良いです。 ちなみに this["drag_mc"+i].onPress = dragMC; などで使った [ ] を「配列アクセス演算子」と言います。 (名称不明な [ ] では調べようにも検索しにくいですよね。) 「FN0507001-ドット演算子と配列アクセス演算子」 http://www.fumiononaka.com/TechNotes/Flash/FN0507001.html その他に関しての詳細などは 例えば「Flash イベントハンドラメソッド」とか 例えば「ActionScript swapDepths」とか そんな感じのキーワードでGoogleなどで検索してもらうと 色々な情報がわかると思います。

kochacha
質問者

お礼

迅速なご回答、本当に本当に感謝いたします。 Flash初心者の私にとってとてもわかりやすく説明していただいたことと きちんと対応していただいたことに本当に感謝いたします。 早速試してみたいと思います。 本当にありがとうございました。 追伸。BlurFiltanさんは、数多くのご質問に丁寧なご回答をなさっていますね。    すばらしいお方だと感心しきりです。    今後ともよろしくお願いいたします。

関連するQ&A