forked from: Old‐fashioned BitmapFilterEffect&Few Particles
forked from BitmapFilterEffect&Particles (diff: 110)
forked from: Old‐fashioned BitmapFilterEffect&Few Particles 定番のブラー+スクロールに一工夫して、見た目変化つかないかなー、という営為。 実際の軌跡を別レイヤーに描いといて、網々っぽかったり影っぽい表現になってる? もともとは衝突判定やろうと思って始めたんだけど脱線したw 変数定義とかぐちゃぐちゃだし いろんな意味でくそコード…orz 高速・軽量化か・・・(遠い目)
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;
}
}
