as3で透過(alpha)付きのマスクの定石ではダメだったのでメモ

Author: kaminaly

やぁやぁ、kaminayです。だいぶ久しぶりの投稿になってしまった。
自分的にも、DevJamMemo的にも。

そんな久しぶりのmemoはハマったのでメモでした(汗

as3で透過(alpha)付きのマスクのやり方は
いろんなブログ(muchoも書いてたような・・・)や、
adobeのマニュアルにもあるので説明は不要だと思いますが、

maskをかける方、かけられる方の
両方のDisplayObjectのcacheAsBitmapを有効にするだけです。

[code lang="as3"]
/*
var view:DisplayObject;
var mask:DisplayObject;
*/
view.cacheAsBitmap = mask.cacheAsBitmap = true;
view.mask = mask;
[/code]

今回、いつものやり方ではうまく動かない事例を発見しました。
多分、バグではないかと思うんだけど、どうだろう。。

ダメだったのはこんな時でした。

[code lang="as3"]
/*
var view:DisplayObject;
var mask:shape;
var bitmapData:BitmapData;
*/
view.cacheAsBitmap = mask.cacheAsBitmap = true;
view.mask = mask;
mask.graphics.beginBitmapFill(bitmapData);
mask.graphics.drawRect(0, 0, bitmapData.width, bitmapData.height);

addEventListener(Event.ENTER_FRAME, function(e:Event):void{
	//bitmapDataをいじいじ
});
[/code]

つまり、graphics.beginBitmapFill()であてた
bitmapDataをmaskの範囲として使う場合です。

cacheAsBitmapでキャッシュされているデータの更新は
DisplayObjectのviewに関する情報の更新を検知して行っていると思うので、
そのチェックするリストにgraphics.beginBitmapFill()であてた
bitmapDataが入ってないんだと思います。

bitmapDataを使いたいなら、Bitmap使えばいいじゃんという話ですが、
※Bitmapの場合は透過付きマスクは先の方法で適応できます。

今、bitmapDataをいじいじするクラスを書いていて、
bitmapDataの参照を他に渡してしまうと、
外からでdisposeをされて動かなくなるとか、
逆に外で使ってるのにdisposeしちゃうとか、
bitmapDataの管理が面倒になると思ったので、
マスターのbitmapDataをクラスで持って、
graphicsを引数でとって、それにdrawRectしてあげるメソッドを用意するという方法をとっていました。
とてもニッチなケースですね(汗

途中までいい具合だったんですが、
maskとして使ってみようかな?と軽い気持ちでいたら急にハマりました。

対処方法は
graphicsに再度drawRectしてあげると更新されます。
まぁ当り前ですね。

他にも方法がありそうなんですが、
scaleを変えてみたりとか色々試しましたが、結局drawRectで落ち着きました。

PS
せっかくマスク効くようになったけど、
拡大しながら使っていたので、
画質的にイマイチという結果に(汗