forked from: Old‐fashioned BitmapFilterEffect&Few Particles

by lagash forked from BitmapFilterEffect&Particles (diff: 110)
forked from: Old‐fashioned BitmapFilterEffect&Few Particles

定番のブラー+スクロールに一工夫して、見た目変化つかないかなー、という営為。
実際の軌跡を別レイヤーに描いといて、網々っぽかったり影っぽい表現になってる?
もともとは衝突判定やろうと思って始めたんだけど脱線したw 変数定義とかぐちゃぐちゃだし いろんな意味でくそコード…orz
高速・軽量化か・・・(遠い目)
♥2 | Line 255 | Modified 2009-09-06 05:46:16 | MIT License
play

ActionScript3 source code

/**
 * Copyright lagash ( http://wonderfl.net/user/lagash )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/hHpe
 */

// forked from dalmacija's Old‐fashioned BitmapFilterEffect&Few Particles
//定番のブラー+スクロールに一工夫して、見た目変化つかないかなー、という営為。
//実際の軌跡を別レイヤーに描いといて、網々っぽかったり影っぽい表現になってる?

//もともとは衝突判定やろうと思って始めたんだけど脱線したw 変数定義とかぐちゃぐちゃだし いろんな意味でくそコード…orz
//高速・軽量化か・・・(遠い目)

package {
    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.display.Bitmap;
    import flash.display.Stage;
    import flash.display.BitmapData;
    import flash.display.DisplayObjectContainer;
    import flash.display.LineScaleMode;
    import flash.display.BlendMode;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;
    import flash.geom.Point;
    import flash.geom.ColorTransform;
    import flash.events.Event;
    import flash.utils.ByteArray;
    import flash.filters.BlurFilter;
    import net.hires.debug.Stats;
    
    public class partest extends Sprite {
		var shape1:Shape;
		var shape2:Shape;
		var tmpBmd:BitmapData;
		var bmp:Bitmap;
		var curves:Object;
		var rotationColor:Number;
		
		var baseMatrix: Matrix = new Matrix();		//var stg:DisplayObjectContainer;
		var baseRect:Rectangle;
		var basePoint:Point;
		var baseColorTransform:ColorTransform;

        private var forceMap: BitmapData;
        private var COLOR: uint = 0xFFFFFF;
        private var seed: int;
        private var mw: int;
        private var mh: int;
        private var arr: Array;
        private var point: Point;
        private var point2: Point;
        private var colorTf: ColorTransform;
        private var blur: BlurFilter;
		
		var frameCounter:Number=0;
		var coefficientOfMass:Number;
		var flg:Boolean;
		
		static public const _TABLE_SIZE:int = 0x10000;
		static public const _PI:Number = Math.PI;
		static public const _RADIANS:Number;// = _DEGREES * (_PI / 180);
		static public const _TWO_PI:Number = 2 * _PI;
		static public const _TWO_PI_SCALE:Number = _TABLE_SIZE / _TWO_PI;
		static public const _HALF_PI:Number = _PI / 2;
		static public const _table:Vector.<Number> = new function ():Vector.<Number>{
			var table:Vector.<Number> = new Vector.<Number>(_TABLE_SIZE, true);
			for (var i:uint = 0; i < _TABLE_SIZE; i++) {
				table[i] = Math.sin(i / _TWO_PI_SCALE);
			}
			return table;
		};
		
		static public var stageWidth;
		static public var stageHeight;
		static public var mouse_X;
		static public var mouse_Y;
		var centerX:uint;
		var centerY:uint;
		
		private var particles:Vector.<particle>=new Vector.<particle>();
		
                public function partest() {
			super();
			addEventListener(Event.ADDED_TO_STAGE, init);
		}

		private function init(e:Event) {
			stage.frameRate = 30;
			stageWidth = stage.stageWidth;
			stageHeight = stage.stageHeight;
			basePoint = new Point(0, 0);
			baseRect = new Rectangle(0, 0, stageWidth, stageHeight);
			baseColorTransform = new ColorTransform;
			//baseColorTransform.alphaMultiplier = .99;
			//baseColorTransform.redMultiplier = baseColorTransform.greenMultiplier = baseColorTransform.blueMultiplier = 1.01;
			baseColorTransform.redOffset = baseColorTransform.greenOffset = baseColorTransform.blueOffset = 1;
			
            forceMap = new BitmapData(stageWidth / 2, stageHeight / 2);
            forceMap.perlinNoise(mw = forceMap.width >> 2, mh = forceMap.height >> 2, 4, 
                seed = Math.random() * 0xFFFF, false, true, 3);
            arr = [point = new Point(), point2 = new Point()];

			shape1 = new Shape();
			shape1.visible = false;
			shape2 = new Shape();
			shape2.visible = false;
			tmpBmd = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0x00000000);
			
			baseMatrix.identity();
			//emptymatrix.b = emptymatrix.c = 2;
			
			stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent) { flg = true; } );
			stage.addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent) { flg = false; particles[particles.length - 1].cut = true; } );
			stage.addEventListener(Event.ENTER_FRAME, enterframeHandlr);
			
			bmp = new Bitmap(new BitmapData(stage.stageWidth, stage.stageHeight, true,0xff000000), "auto", true);//bitmap処理用
			addChild(bmp);
			addChild(shape1);
			addChild(shape2);
			addChild(new Stats());


			
		}
		

		private function mouseclickHandlr(e) {
			flg = true;
			enterframeHandlr(e);
			flg = false; 
		}
		
		
		private function enterframeHandlr(e)
		{
			frameCounter+=.01;
			coefficientOfMass = (_table[(frameCounter * _TWO_PI_SCALE) & (_TABLE_SIZE - 1)]*_table[(frameCounter * _TWO_PI_SCALE) & (_TABLE_SIZE - 1)])*3;
			
			mouse_X = e.currentTarget.mouseX;
			mouse_Y = e.currentTarget.mouseY;
			var flg_2 = 0;
			bmp.bitmapData.lock();
			shape1.graphics.clear();
			shape2.graphics.clear();
			centerX = centerY = 0;
			
			//focemap
            var col: uint, h: Number;
			point.x ++;
			point2.y ++;
			forceMap.perlinNoise(mw, mh, 4, seed, false, true, 3, false, arr);
			
			for (var i = 0; i < particles.length; i++) {
				var tmpObj = particles[i];
				tmpObj.M = coefficientOfMass;
				var velo=Math.abs(particles[i].tx*particles[i].ty);
				if (velo > 10 && i!=0 && !flg) { mouse_X = tmpObj.xx; mouse_Y = tmpObj.yy; flg_2 = 1; }
				
				//shape1.graphics.lineStyle(velo * 4, 0xeeeeee, velo, false);
				shape2.graphics.lineStyle(1, tmpObj.col, .2, false);
				
				if (i == 0 ) {
					//shape1.graphics.moveTo(tmpObj.obj.xx + tmpObj.obj._x * .5, tmpObj.obj.yy + tmpObj.obj._y * .5);
					shape2.graphics.moveTo(tmpObj.obj.xx + tmpObj.obj._x * .5+tmpObj.obj.tx*5, tmpObj.obj.yy + tmpObj.obj._y * .5+tmpObj.obj.ty*5);
				}
				//shape1.graphics.curveTo(tmpObj.xx + tmpObj._x, tmpObj.yy + tmpObj._y, tmpObj.xx + tmpObj._x * .5, tmpObj.yy + tmpObj._y * .5);
				shape2.graphics.curveTo(tmpObj.xx + tmpObj._x+tmpObj.tx*5, tmpObj.yy + tmpObj._y+tmpObj.ty*5, tmpObj.xx + tmpObj._x * .5+tmpObj.tx*5, tmpObj.yy + tmpObj._y * .5+tmpObj.ty*5);
				shape1.graphics.lineStyle(velo * 4, 0xeeeeee, .2, true);
				shape1.graphics.drawCircle(tmpObj.xx, tmpObj.yy, velo*5);

				tmpBmd.setPixel32(tmpObj.xx, tmpObj.yy, 0x88000000);// particles[i].col);
				
				centerX += tmpObj.xx;
				centerY += tmpObj.yy;
				
				//forcemap
                col = forceMap.getPixel(tmpObj.xx >> 1, tmpObj.yy >> 1);
                tmpObj.tx += (( col >> 16 & 0xff) - 128) * 0.0001;
                tmpObj.ty += (( col >>  8 & 0xff) - 128) * 0.0001;
                //tmpObj.tx = tmpObj.tx * 0.98 + (( col >> 16 & 0xff) - 128) * 0.004;
                //tmpObj.ty = tmpObj.ty * 0.98 + (( col >>  8 & 0xff) - 128) * 0.004;
				
                //if (p.x < 0) p.x += WIDTH;
                //else if (p.x >= WIDTH) p.x -= WIDTH;
                //if (p.y < 0) p.y += HEIGHT;
                //else if (p.y >= HEIGHT) p.y -= HEIGHT;
                //h = p.vx * p.vy * 3;
                //h = h < 0 ? h : - h;
                //bmd.setPixel(p.x * baseMatrix.a + p.y * baseMatrix.c + baseMatrix.tx, 
                   // p.x * baseMatrix.b + p.y * baseMatrix.d + baseMatrix.ty + h, COLOR);
					
			}
			
			centerX /= particles.length;
			centerY /= particles.length;
			
			//スクロール処理
			//bmp.bitmapData.scroll((stageWidth / 2 - centerX) / 10, (stageHeight / 2 - centerY) / 10);
			tmpBmd.scroll(_table[((frameCounter + _HALF_PI) * _TWO_PI_SCALE) & (_TABLE_SIZE - 1)] * 10, _table[(frameCounter * _TWO_PI_SCALE) & (_TABLE_SIZE - 1)] * 10);
			//tmpBmd.colorTransform(baseRect, baseColorTransform);
			//tmpBmd.scroll( -(stageWidth / 2 - centerX) / 5, -(stageHeight / 2 - centerY) / 5);
			bmp.bitmapData.scroll( -(stageWidth / 2 - centerX) / 10, -(stageHeight / 2 - centerY) / 10);
			
			bmp.bitmapData.draw(shape1,baseMatrix, null, BlendMode.LIGHTEN);
			bmp.bitmapData.draw(shape2,baseMatrix, null, BlendMode.ADD);
			bmp.bitmapData.copyPixels(tmpBmd, baseRect, basePoint, tmpBmd, new Point(0, 0), true);
			bmp.bitmapData.applyFilter(bmp.bitmapData, baseRect, basePoint,new BlurFilter(2,2,1));
			bmp.bitmapData.draw(shape1,baseMatrix, null, BlendMode.OVERLAY);
			bmp.bitmapData.unlock();
			
			
			if (!flg && flg_2==0 || (mouse_X<0 || mouse_X>stageWidth || mouse_Y<0 || mouse_Y>stageHeight)) return;
			if (particles.length > 0) {
				if (getLineLength(new Rectangle(particles[particles.length - 1].xx, particles[particles.length - 1].yy, mouse_X, mouse_Y)) < 3) { ; return false; }
				
				do{
					var newX = mouse_X + (Math.random() * 100-50) * flg_2;
					var newY = mouse_Y + (Math.random() * 100-50) * flg_2;
				}while (newX<0 || newX>stageWidth || newY<0 || newY>stageHeight);
				
				particles.push(new particle(newX,newY, particles.length, particles[particles.length-1]));
				shape1.graphics.lineStyle(20+flg_2*20, 0xffffff, .2, true);
				shape1.graphics.drawCircle(newX, newY, 40+flg_2*30);
				bmp.bitmapData.draw(shape1,baseMatrix, null, BlendMode.LIGHTEN);
				particles[0].setObj(particles[particles.length-1]);
			} else {
				
				particles.push(new particle(mouse_X,mouse_Y,0));

			}

			if (particles.length > 40) {
				shape1.graphics.lineStyle(30, 0x000000, .8, true);
				shape1.graphics.drawCircle(particles[0].xx, particles[0].yy, 60);
				bmp.bitmapData.draw(shape1,baseMatrix, null, BlendMode.SUBTRACT);
				tmpBmd.draw(shape1,baseMatrix, null, BlendMode.ERASE);
				particles.shift();
			}

		}
	
		function getLineLength(p:Rectangle):Number
		{
			var vx=p.x-p.width;
			var vy=p.y-p.height;
			var vl=Math.sqrt(Math.pow(vx,2)+Math.pow(vy,2));
			return vl;
		}
		

    }
}
    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.display.Bitmap;
    import flash.display.Stage;
    import flash.display.BitmapData;
    import flash.display.DisplayObjectContainer;
    import flash.display.LineScaleMode;
    import flash.display.BlendMode;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;
    import flash.geom.Point;
    import flash.geom.ColorTransform;
    import flash.events.Event;
    import flash.utils.ByteArray;
    import flash.filters.BlurFilter;

	class particle extends Sprite{
		
		var col:uint = 0;
		var ox:Number=0;
		var oy:Number=0;
		var ol:Number=0;
		var xx:Number=0;
		var yy:Number=0;
		var _x:Number=0;
		var _y:Number=0;
		var tx:Number=0;
		var ty:Number=0;
		var dx:Number=0;
		var dy:Number=0;
		var dl:Number = 0;
		var M:Number=1;
		var cnt:Number=0;
		var obj:particle;
		var cut:Boolean = false;
		
		public function particle(... args):void {
			
			ox= xx = args[0];
			oy= yy = args[1];
			name = args[2];
			obj = args[3];
			
			if (args[3]==undefined)obj = this;
			
			var tmptime = new Date();
			cnt = tmptime.milliseconds * .002 * Math.PI;
			tx = partest._table[((cnt + partest._HALF_PI) * partest._TWO_PI_SCALE) & (partest._TABLE_SIZE - 1)];
			ty = partest._table[(cnt * partest._TWO_PI_SCALE) & (partest._TABLE_SIZE - 1)];
			col = Math.random() * 16777215;
			
			addEventListener(Event.ENTER_FRAME, enterFrameHndlr);
		}
		
		private function enterFrameHndlr(e:Event) {
			calcVector();
		}
		private function calcVector() {
			cnt += (cnt < 12.56)?.3: -cnt;
			
			_x = obj.xx - this.xx;
			_y = obj.yy - this.yy;
			
			ol = _x * _x + _y * _y;
			if (ol > 3) {
				
				dx = _x / ol;
				dy = _y / ol;
				
				dx = (!dx)?0:dx;
				dy = (!dy)?0:dy;
				
				dx = (Math.abs(dx)<2)?dx:dx/Math.abs(dx);
				dy = (Math.abs(dy)<2)?dy:dy/Math.abs(dy);
				tx += (dx * uint(dx > 0 && tx < 5) + dx * uint(dx<0 && tx>-5))*M;
				ty += (dy * uint(dy > 0 && ty < 5) + dy * uint(dy<0 && ty>-5))*M;
				tx = (Math.abs(tx)<5)?tx:tx/Math.abs(tx)*5;
				ty = (Math.abs(ty)<5)?ty:ty/Math.abs(ty)*5;
			}
			xx += tx;
			yy += ty;
			if(partest.stageWidth){
				if (xx < 0 || xx > partest.stageWidth) { xx -= tx; tx = -tx*.3; }
				if (yy < 0 || yy > partest.stageHeight) { yy -= ty; ty = -ty*.3; }
			}
			
		}
		
		public function setObj(o):void {
			obj = o;
		}
		
		public function setMass(m):void {
			M = m;
		}
		
	}