- ベストアンサー
背面のコンポーネントが操作できてしまう
ActionScript2で画面を作っております。 ボタンなどのコンポーネントが並んだメインの画面の上に ダイアログボックスを表示させたいと思い、 getNextHighestDepth()で取得した深度に empty movieclipを作って、 そこにダイアログボックスのビットマップをattachして 表示させました。 表示はうまくできたのですが、ダイアログボックスの上から 背面にあるボタンなどが操作できてしまいます。 ダイアログボックス表示中は背面のコンポーネントは 操作できなくしたいのですが、どうすればよいでしょうか? 背面のコンポーネントにenabled=falseを設定するのも 考えましたが、数が多いのでいちいち設定するのが大変です。 デザイン上visible=falseにすることもできません。 最前面のビットマップ(orそれがattachされているmovieclip)に だけマウスイベントが来るようにできればよいのですが。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
肝心な Flash のバージョンを書かれていらっしゃいませんが...。 どっちみちコンポーネントを使用されるのでしたら Alertコンポーネントを使えば解決すると思いますが(ただし確か Flash 8 以上)。 Alertコンポーネントを一旦ステージ上に配置して,すぐに削除し, --------------------------------- import mx.controls.Alert; Alert.show("メッセージ", "タイトル"); --------------------------------- このようなスクリプトを書くだけで Alertコンポーネントのみが出没して他のボタン機能などがすべて無効になります。 ===別法============================================== 別法というか#1の方の路線と同じです。 > getNextHighestDepth()で取得した深度に > empty movieclipを作って、 > そこにダイアログボックスのビットマップをattachして > 表示させました。 この具体的な状況が全くわかりませんが, その 「ダイアログボックスのビットマップ」 の1つ下の深度に ステージ全体の透明な塗り入りムービークリップを用意して, その透明ムービークリップに 擬似onRelease を定義して さらにハンドカーソルを無効にすれば良いのではないでしょうか? これは ActionScriptなど関係なしでFlash作成上でよく使われる手段です。 その手段をスクリプト化したものです。 コピペするだけでできるサンプル↓。 ------------------------------------------------ // DepthManagerをimport import mx.managers.DepthManager; // 空のムービークリップ [btn_mc] を _root の最高深度に作成 var btn_mc:MovieClip = _root.createEmptyMovieClip("btn_mc", _root.getNextHighestDepth()); // DepthManagerで改めて使用可能な最上位の深度に再設定 btn_mc.setDepthTo(DepthManager.kTop); // [btn_mc] にステージ全体に広がる透明な塗りを作成 // (ここでは見えるように黒の半透明にしておきます) btn_mc.beginFill(0x000000, 20); btn_mc.moveTo(0, 0); btn_mc.lineTo(Stage.width, 0); btn_mc.lineTo(Stage.width, Stage.height); btn_mc.lineTo(0, Stage.height); btn_mc.lineTo(0, 0); // [btn_mc] にダミーの onRelease を設定 btn_mc.onRelease = function():Void { }; // [btn_mc] のハンドカーソルを無効にする btn_mc.useHandCursor = false; // --- 以下は適当 --- // テキストフィールド [btn_txt] を [btn_mc] の上の深度に作成 var btn_txt:TextField = _root.createTextField("btn_txt", btn_mc.getDepth()+1, 150, 100, 0, 0); // [btn_txt] の書式などを設定 btn_txt.border = true; btn_txt.background = true; btn_txt.autoSize = true; btn_txt.text = "★ココをクリック★"; // [btn_txt] をクリック(プレス)したときの動作を定義 btn_txt.onSetFocus = function():Void { // テキストフィールドとムービークリップの後片付け btn_txt.removeTextField(); btn_mc.removeMovieClip(); }; ------------------------------------------------ ※ Flash MX 2004 をお使いの場合は または Flash Player7 用SWFをパブリッシュする場合は, // テキストフィールド [btn_txt] を [btn_mc] の上の深度に作成 var btn_txt:TextField = _root.createTextField("btn_txt", btn_mc.getDepth()+1, 150, 100, 0, 0); ↓変更↓ // テキストフィールド [btn_txt] を [btn_mc] の上の深度に作成 _root.createTextField("btn_txt", btn_mc.getDepth()+1, 150, 100, 0, 0); 「F-site 意外と使えないMovieClip.getNextHighestDepth()」 http://f-site.org/articles/2004/12/12021122.html 「F-site 深度の管理 DepthManager」 http://f-site.org/articles/2006/06/02202128.html
その他の回答 (1)
- cspl
- ベストアンサー率83% (55/66)
方法はいくつか考えられますが、簡単な方法の一つとして、最前面のオブジェクトのすぐ下の階層にステージ全体を被う透明なムービークリップを敷いて、onReleaseなどのマウスに反応する関数を仮に定義しておけば背面にあるオブジェクトはマウスに反応しません。 マウスカーソルが指になるのを避けるため、useHandCursorを切ります。 ________ //ステージを被う透明のムービークリップbgMaskを最前面のオブジェクトの下に配置する。 bgMask.onRelease = function(){}; bgMask.useHandCursor = false; ________
補足
デザイナーの作った画面を使うのが前提なので 別法で試してみました。 setDepthTo()を使うとなぜか表示されませんでしたが、 おおむねサンプルの通りで動作しました。 ありがとうございました。