2つの透明部分を含む画像をそれぞれMovieClip化し、マウスイベントで何らかの処理をしたい。
とっても簡単なことなのだが、ここにちょっとした問題が潜んでいた。
画像が重なりあった時、下のMCをクリックしたいのに、上にあるMCの透明部分が邪魔でクリックできないのだ。
オブジェクトを動かしている場合、画像が重なりあうのは必至。
これって結構迷惑な話である。
その対応として、mc.mouseEnabled = false; を利用してみる。
ただし、そう単純な話ではない。
上のMCにこれを設定してしまうと、上のMCをクリックしたつもりでも、下のMCをクリックしてしまう。そう、透明部分を無効にするのではなく、MC自体のマウスイベントを無効にするのだ。(あたりまえだけど)
なので、MCの構造自体を全くの別物に変えてあげる必要がある。
準備するものとしては、透明画像:Aの他に、Aを「ビットマップのトレース」したもの:B。
それらを以下のようなレイヤーでMovieClip化する。
注:Aに半透明な部分が含まれる場合は、Bのアルファを0にしておく必要がある。
targetMc
├ pngMc
| └ 透明画像:A
└ bitmapMc
└ 「ビットマップのトレース」をしたもの:B
で、ActionScriptでは以下のように指定する。
targetMc.mouseEnabled = false;
targetMc.pngMc.mouseEnabled = false;
targetMc.bitmapMc.addEventListener( MouseEvent.MOUSE_UP, onClick );
function onClick(e){
trace("targetMc Clicked");
}
targetMc.pngMc.mouseEnabled = false;
targetMc.bitmapMc.addEventListener( MouseEvent.MOUSE_UP, onClick );
function onClick(e){
trace("targetMc Clicked");
}
解る人には当たり前の話だが、実際にクリックされているのは、bitmapMcなわけで、実際の画像はマウス操作ができない状態で表示されているだけ。
合わせて targetMcを mouseEnabled = false することで、bitmapMc のみをクリックのターゲットとする。
ちなみに、カーソルを指にする buttonMode = true; の指定については、targetMc でも targetMc.bitmapMc でも同じ結果になるようだ。(個人的には、addEventListener するターゲットと同じにした方が分かりやすいと思う)
また、単純に透明画像を含むMCが重なりあっていて、下のMCだけクリックしたいが、絵が重なっているところはクリックさせたくない場合にも使えるはず。