In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: beginGradientFill() の透明度はマスクに反映されない?

beginBradientFill() の透明度はマスクに反映されない?
------------------------------------------------------------
上: マスクに利用するSprite
下: マスクした結果
→グラデーションでマスクされてほしいのに、べったりと切り取られてる...
------------------------------------------------------------
マスクを作るときに beginGradientFill() の透明度情報を使えると嬉しい
んだけど、どうもできない気配がある。
すっきり実装する方法はないものか。もちろん、BitmapData を使ったり、
for 文を使ってマスク画像を作ればグラデーションでマスクを実装はできるんだけど
実装はめんどくさいし、コードが冗長になる。
Get Adobe Flash player
by zahir 06 Sep 2009
    Embed
/**
 * Copyright zahir ( http://wonderfl.net/user/zahir )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/weWj
 */

// forked from nitoyon's beginBradientFill() の透明度はマスクに反映されない?
// beginBradientFill() の透明度はマスクに反映されない?
//------------------------------------------------------------
//   上: マスクに利用するSprite
//   下: マスクした結果
//       →グラデーションでマスクされてほしいのに、べったりと切り取られてる...
//------------------------------------------------------------
// マスクを作るときに beginGradientFill() の透明度情報を使えると嬉しい
// んだけど、どうもできない気配がある。
// すっきり実装する方法はないものか。もちろん、BitmapData を使ったり、
// for 文を使ってマスク画像を作ればグラデーションでマスクを実装はできるんだけど
// 実装はめんどくさいし、コードが冗長になる。
package {
    import flash.display.Sprite;
    import flash.geom.Matrix;

    public class FlashTest extends Sprite {
        public function FlashTest() {
            // マスク画像を作成する
            var msk1:Sprite = createMask();
            addChild(msk1);

            // 赤い Sprite を作成する
            var canvas:Sprite = new Sprite();
            canvas.graphics.beginFill(0xff0000);
            canvas.graphics.drawRect(0, 0, 400, 400);
            canvas.graphics.endFill();
            addChild(canvas);

            // 赤い Sprite のマスクを利用する...
            // マスクに透明度が反映されてほしいが、アルファ1でマスクされる!!
            var msk2:Sprite = createMask();
            msk2.y = 80;
            
            // maskするほうもaddChild
            addChild(msk2);
            
            // casheAsBitmap = true にしてあげないとアルファを維持してくれない謎の使用
            msk2.cacheAsBitmap = canvas.cacheAsBitmap = true;
            canvas.mask = msk2;
        }
        
        private function createMask():Sprite{
            // Matrix を作成
            var mtx:Matrix = new Matrix();
            mtx.createGradientBox(300, 40);
            
            // マスクを作成
            var msk:Sprite = new Sprite();
            msk.graphics.beginGradientFill("linear", 
                [0x00ff00, 0x00ff00],
                [1, 0],
                [0, 255],
                mtx);
            msk.graphics.drawRect(0, 0, 300, 40);
            msk.graphics.endFill();
            
            return msk;
        }
    }
}