Beautifl - Flash Gallery

Preview

Saqoosha 先生による煌めきエフェクトの俺用テンプレート
Aquioux 2009年11月9日 MIT License
?
Saqoosha 先生による煌めきエフェクトの俺用テンプレート  
@author YOSHIDA, Akio (Aquioux)
      package {
    import flash.display.Sprite;
    import flash.events.Event;
    import net.hires.debug.Stats;
    /**
     * Saqoosha 先生による煌めきエフェクトの俺用テンプレート
     * @author YOSHIDA, Akio (Aquioux)
     */
    [SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "#000000")]
    
    public class Main extends Sprite {
        public function Main() {
            // Model を生成
            var model:Model = new Model(10000);
            model.setup(stage);

            // View を生成
            var view:View = new View(model);
            addChild(view);
            
            addChild(new Stats());
        }
    }
}


    /**
     * Model
     */
    import flash.display.Stage;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    class Model extends EventDispatcher {
        // 外部へ渡すデータ
        // X座標、Y座標、色の順番の1次元 Vector
        public function get data():Vector.<Number> { return _data; }
        private var _data:Vector.<Number>;
        // 上記 Vector の1次元にする要素数
        public const NUM_OF_BLOCK:uint = 3;
        
        // 外部から受けるデータ
        // 引数として受ける
        private var numOfParticle:uint;
        
        // 内部で使用するデータ
        private var particles:Array;
        
        // ENTER_FRAME のタイミングで呼び出される
        internal function update(event:Event):void {
            var n:uint = numOfParticle;
            var nob:uint = NUM_OF_BLOCK;
            var range2:Number = 6;
            var range1:Number = range2 / 2;
            for (var i:int = 0; i < n; i++) {
                var p:Particle2D = particles[i];
                p.x += Math.random() * range2 - range1;
                p.y += Math.random() * range2 - range1;
                _data[i * nob]     = p.x;
                _data[i * nob + 1] = p.y;
                _data[i * nob + 2] = p.color;
            }
            
            // リスナー(View)へ通知
            dispatchEvent(new Event(Event.CHANGE));
        }
        
        
        public function Model(numOfParticle:uint) {
            // 外部から受けるデータを引数として受ける
            this.numOfParticle = numOfParticle;
            // 外部に渡すデータの初期化
            _data = new Vector.<Number>(this.numOfParticle * NUM_OF_BLOCK, true);
        }
        
        public function setup(stage:Stage):void {
            var x:Number = stage.stageWidth / 2;
            var y:Number = stage.stageHeight / 2;
            particles = [];
            for (var i:int = 0; i < this.numOfParticle; i++) {
                particles[i] = new Particle2D(x, y, Math.random() * 0xFFFFFF >> 0);
            }
            
            stage.addEventListener(Event.ENTER_FRAME, update);
        }
    }


    /**
     * View
     */
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BlendMode;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.ColorTransform;
    import flash.geom.Matrix;
    class View extends Sprite {
        private const SCALE:Number = 15;
        private const COLOR_TRANSFORM:ColorTransform = new ColorTransform(0.95, 0.95, 0.95, 0.95);
        
        private function changeHandler(event:Event):void {
            // Model からデータを受ける
            var data:Vector.<Number> = model.data;

            // 描画
            canvas.lock();
            canvas.fillRect(canvas.rect, 0x000000);
            var n:uint = data.length / numOfBlock;
            for (var i:int = 0; i < n; i++) {
                var posX:Number  = data[i * numOfBlock];
                var posY:Number  = data[i * numOfBlock + 1];
                var color:Number = data[i * numOfBlock + 2];
                canvas.setPixel(posX, posY, color);
            }
            canvas.colorTransform(canvas.rect, COLOR_TRANSFORM);
            canvas.unlock();
            twincles.draw(canvas, twinklesMatrix);
        }

        private var model:Model;
        public function View(model:Model) {
            this.model = model;
            this.model.addEventListener(Event.CHANGE, changeHandler);
            addEventListener(Event.ADDED_TO_STAGE, setup);
        }
        private var numOfBlock:uint;        // イテレート要素数
        private var canvas:BitmapData;        // 一般キャンバス
        private var twincles:BitmapData;    // 煌きキャンバス
        private var twinklesMatrix:Matrix;    // 煌きキャンバス用 Matrix
        private function setup(event:Event):void {
            removeEventListener(Event.ADDED_TO_STAGE, setup);
            
            numOfBlock = model.NUM_OF_BLOCK;
            
            // 一般キャンバスの生成
            canvas = new BitmapData(stage.stageWidth, stage.stageHeight, false);
            var canvasBitmap:Bitmap = new Bitmap(canvas);
            canvasBitmap.smoothing = true;
            addChild(canvasBitmap);

            // 煌きキャンバスの生成
            twincles = new BitmapData(stage.stageWidth / SCALE >> 0, stage.stageHeight / SCALE >> 0, false);
            twinklesMatrix = new Matrix(1 / SCALE, 0, 0, 1 / SCALE);
            var twinklesBitmap:Bitmap = new Bitmap(twincles);
            twinklesBitmap.scaleX = twinklesBitmap.scaleY = SCALE;
            twinklesBitmap.smoothing = true;
            //twinklesBitmap.blendMode = BlendMode.LIGHTEN;
            twinklesBitmap.blendMode = BlendMode.ADD;
            addChild(twinklesBitmap);
        }
    }


    /**
     * 2次元用パーティクル
     */
    class Particle2D {
        // X座標
        public var x:Number;
        // Y座標
        public var y:Number;
        // 色
        public var color:uint;
        
        public function Particle2D(x:Number = 0, y:Number = 0, color:uint = 0) {
            this.x = x;
            this.y = y;
            this.color = color;
        }
    }