やぁやぁ、kaminayです。だいぶ久しぶりの投稿になってしまった。
自分的にも、DevJamMemo的にも。
そんな久しぶりのmemoはハマったのでメモでした(汗
as3で透過(alpha)付きのマスクのやり方は
いろんなブログ(muchoも書いてたような・・・)や、
adobeのマニュアルにもあるので説明は不要だと思いますが、
maskをかける方、かけられる方の
両方のDisplayObjectのcacheAsBitmapを有効にするだけです。
/* var view:DisplayObject; var mask:DisplayObject; */ view.cacheAsBitmap = mask.cacheAsBitmap = true; view.mask = mask;
今回、いつものやり方ではうまく動かない事例を発見しました。
多分、バグではないかと思うんだけど、どうだろう。。
ダメだったのはこんな時でした。
/* 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をいじいじ });
つまり、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
せっかくマスク効くようになったけど、
拡大しながら使っていたので、
画質的にイマイチという結果に(汗