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

[1日1Wonderfl]8日目: Reflection やってみたよ

1日1Wonderfl 8/30日目
Reflection やってみたよ
*
*  覚えておく事:
*      - reflect となる DisplayObject の cacheAsBitmap は true に
*      - reflect の mask となる DisplayObject も cacheAsBitmap は true に
*          - 上の2つが見たされてないとフェードしない
/**
 * Copyright soundkitchen ( http://wonderfl.net/user/soundkitchen )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/aERv
 */

// 1日1Wonderfl 8/30日目
/**
 *  Reflection やってみたよ
 *
 *  覚えておく事:
 *      - reflect となる DisplayObject の cacheAsBitmap は true に
 *      - reflect の mask となる DisplayObject も cacheAsBitmap は true に
 *          - 上の2つが見たされてないとフェードしない
 */
package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
    import flash.display.GradientType;
    import flash.display.Graphics;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.Matrix;

    [SWF(width=465, height=465, frameRate=30, backgroundColor=0xffffff)]

    public class Main extends Sprite
    {
        private var container:Sprite;

        /**
         *  コンストラクタ
         */
        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE, initialize);
        }

        /**
         *  メインロジック!!
         */
        private function initialize(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, initialize);

            var W:Number, H:Number,
                g:Graphics,
                mtx:Matrix,
                bmd:BitmapData,
                original:Bitmap,
                reflect:Bitmap,
                maskShape:Shape;

            //  stage の幅と高さを int にして保持
            W = stage.stageWidth >> 0;
            H = stage.stageHeight >> 0;

            container = new Sprite();
            bmd = createCloud(120, 160);

            //  オリジナルデータとして Bitmap を作る
            original = container.addChild(new Bitmap(bmd)) as Bitmap;

            //  反射用データとして Bitmap を作る
            reflect = container.addChild(new Bitmap(bmd)) as Bitmap;
            //  逆さむきにする
            reflect.scaleY = original.scaleY * -1;
            //  x と y を調節
            //  y はひっくり返ってる事も考慮する
            reflect.x = original.x;
            reflect.y = original.height + reflect.height;
            //  ココ重要
            //  これしないとフェードしない
            reflect.cacheAsBitmap = true;

            //  マスク用の Shape を作成
            maskShape = container.addChild(new Shape()) as Shape;
            //  x と y を調節
            //  マスク用のデータなので reflect なデータとカブるようにする
            maskShape.x = reflect.x;
            maskShape.y = original.height;
            //  ココ重要
            //  これしないとフェードしない
            maskShape.cacheAsBitmap = true;
            //  マスクとして設定
            reflect.mask = maskShape;

            //  Graphics を変数に特攻む
            g = maskShape.graphics;
            //  Gradient 用の Matrix 作る
            mtx = new Matrix();
            //  幅と高さを reflect と合わせて縦方向に設定
            //  Math.PI / 2 は 90 度だよ
            mtx.createGradientBox(reflect.width, reflect.height, Math.PI / 2);
            //  グラデーションな塗り
            g.beginGradientFill(
                GradientType.LINEAR,
                [0x00, 0x00],
                [.75, 0],
                [0, 255>>1],
                mtx
            );
            //  幅と高さを reflect に合わせて四角を書く
            g.drawRect(0, 0, reflect.width, reflect.height);
            //  おえかきおしまい
            g.endFill();

            //  コンテナの位置をセンターに設定
            container.x = (W - original.width) >> 1;
            container.y = (H - original.height) >> 1;
            //  ドキュメントクラスに特攻む
            addChild(container);
        }

        /**
         *  指定された幅・高さに合わせて、ぺろりんのいずな BitmapData 作る
         */
        private function createCloud(width:Number, height:Number):BitmapData
        {
            var bmd:BitmapData;

            bmd = new BitmapData(width, height);
            bmd.perlinNoise(
                width >> 3,                 //  baseX
                height >> 3,                //  baseY
                8,                          //  numOctaves
                (Math.random() * 100) >> 0, //  randomSeed
                true,                       //  stitch
                true,                       //  fractalNoise
                BitmapDataChannel.RED,      //  channelOptions
                false                       //  grayScale
            );
            return bmd;
        }
    }
}