mouseEnabledに関するbuttonModeとenabeldの挙動
基本的な情報の整理
DisplayObjectのうち、FlashIDEでの開発で最も頻繁に利用するのは「Sprite」および「MovieClip」だと思います。これらはどちらもInteractiveObjectクラスを継承しており、マウス操作に関するメソッドやプロパティを実装しています。
定番な操作としては、ムービークリップのボタン化と、その有効無効の制御、マウスイベントなどだと思います。
その中でもボタン化と無効化のあたりがわかりづらいので少し整理してみました。
InteractiveObject.mouseEnabled
マウスイベントの送出をコントロールします。falseの場合buttonModeも事実上無効になるようです。
MovieClip.enabled
MovieClipのフレームラベルによるボタン化を可能にします。ラベルに”_up”, ”_over”, ”_down”とつけることで各マウスアクション時にそのフレームに遷移する簡易ボタンがつくれます。Flashに昔からあるボタンシンボルと同様の挙動になります。マウスイベントは送出されます。
Sprite.buttonMode
カーソルが指になります。MovieClipの場合はenabeldのようなフレームラベルによるボタンの状態を変化ができます。
enabledやmouseEnableがfalseの時は無効になると思われますが、両方trueでないと有効にならないため、なぜそれぞれに分かれているのか不明です。enabledはデフォルトで trueなので通常あまりきにすることはないと思われますが、稀にハマりますので、それは後記します。
このプロパティもマウスイベントの送出には作用しません。
Sprite.useHandCursor
buttonModeがtrue時のカーソルを指にするかどうかの切り替えをします。buttonModeがfalseの時は意味ないです。
InteractiveObject.doubleClickEnabled
ダブルクリックのイベントの送出をコントロールします。デフォルトでfalseなので、必要に応じてtrueにします。またmouseEnabled が falseだとこちらも無効になります。
DisplayObjectContainer.mouseChildren
子要素のマウスイベントを受け取るかどうかを切り替える。AS2と違って、mouseEnabledは子要素に効かないため、意図しない入れ子のマウスイベントの伝播を無効にしたいときはこれをfalseにします。
根本的に無効にするにはどうしたらいいか
基本的にはマウス操作を無効にするためには mouseEnabledを falseにするだけです。その他のプロパティはボタンとしてのあしらいについての操作になります。
あわせてmouseChildrenをfalseにしておけば、意図しないマウスイベントで悩まされることもないと思います。
ただし、mouseEnabledと buttonMode が絡み合う部分で注意が必要なところがあります。
無効化した時のフレーム操作
問題になる場合は、クリック操作などマウスが上に乗った状態でmouseEnabledを切り替えたときで、スクリプトでフレーム操作が上手くいかないという場合があります。
ようはbuttonModeを使いつつ、クリックしたら無効にして同時にボタン内の”disable”といったフレームに移動したいのに”_up”に戻ってしまうというケースです。
部品を分けて細かく作りこめば解消できると思いますが、簡易にボタン内の絵のきりかえをしたい場合ちょっと不便です。
mc1.buttonMode = true; mc1.mouseChildren = false; mc1.addEventListener(MouseEvent.MOUSE_UP,trace); mc1.addEventListener(MouseEvent.MOUSE_OVER,trace); mc1.addEventListener(MouseEvent.ROLL_OUT,trace); mc1.addEventListener(MouseEvent.ROLL_OVER,trace); mc1.addEventListener(MouseEvent.CLICK, function(){ trace("click"); mc1.mouseEnabled = false; mc1.gotoAndStop("disable") } );
実験してみたところ、mouseEnabled を falseにした直後、(マウスカーソルが乗っているせいか)rollOutイベントが発生しているのがわかります。このため CLICKイベントでラベルを移動したあとに"_up"に移動してしまうような現象が起こっていると考えられます。
このようなときに、この自動でフレームラベルを切り替える機能、すなわち buttonModeまたは enabledをオフにすればこの現象を回避できます。
またmouseEnabled を trueにすると同時に buttonMode/enabledを trueにすれば良さそうです。
mc1.buttonMode = true; mc1.mouseChildren = false; mc1.addEventListener(MouseEvent.MOUSE_UP,trace); mc1.addEventListener(MouseEvent.MOUSE_OVER,trace); mc1.addEventListener(MouseEvent.ROLL_OUT,trace); mc1.addEventListener(MouseEvent.ROLL_OVER,trace); mc1.addEventListener(MouseEvent.CLICK, function(){ trace("click"); mc1.buttonMode = false; mc1.mouseEnabled = false; mc1.gotoAndStop("disable") } );
結局buttonModeと enabledはどっちがいいのか。
先程もまとめたように buttonModeで enabledも無効になったように見えるので、MovieClipがSpriteを継承してますし、全部buttonModeでコントロールすれば良いように思います。
このあたりもっと詳しい人がいたらぜい教えてください。