Beautifl - Flash Gallery

Thumbnail : Saqoosha 先生による煌めきエフェクトの俺用テンプレート
Saqoosha 先生による煌めきエフェクトの俺用テンプレート
Aquioux 2009-11-09 MIT License

再生するにはFlash Playerが必要です。デスクトップのブラウザでご覧ください。

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;
		}
	}