forked from: 染みが広がるような
// forked from HaraMakoto's 染みが広がるような
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.filters.BlurFilter;
import flash.geom.Point;
[SWF(width="465", height="465", backgroundColor="0xFFFFFF", frameRate="60")]
public class Hirogari extends Sprite
{
private var PM:ParticleMaster;
private var bmp:Bitmap;
private var bmpData:BitmapData;
private var base:Sprite = new Sprite();
private var fcounter:uint = 0;
public function Hirogari()
{
addEventListener(Event.ADDED_TO_STAGE, _addStage);
}
private function _addStage(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, _addStage);
bmpData = new BitmapData( stage.stageWidth, stage.stageHeight,true, 0xFFFFFF );
bmp = new Bitmap( bmpData );
addChild( base );
addChild( bmp );
PM = new ParticleMaster();
base.addChild( PM );
PM.x = stage.stageWidth/2;
PM.y = stage.stageHeight/2;
addEventListener( Event.ENTER_FRAME, _onEnterFrame );
}
private function _onEnterFrame(e:Event):void
{
bmpData.draw( base,null,null );
//var blr:BlurFilter = new BlurFilter(2,2,1);
//bmpData.applyFilter(bmpData,bmpData.rect, new Point(0,0),blr);
if(fcounter%120==0) PM._putPerticle(null);
fcounter++;
}
}
}
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.Shape;
import caurina.transitions.Tweener;
class ParticleMaster extends Sprite
{
private var pointsArray:Array = new Array();
private var particleArray:Array = new Array();
private var pointsNum:uint = 20; //ポイント数
private var c:Number = 0.04;
private var n:Number = 0.0;
private var d:Number = 0.8;
private var shape:Shape = new Shape();
private var cnt:uint = 0;
private var myColor:Number;
public function ParticleMaster()
{
super();
addChild( shape );
addEventListener(Event.ADDED_TO_STAGE, _addStage);
setPoints();
}
private function _addStage(e:Event):void
{
myColor = 0x000000;
removeEventListener(Event.ADDED_TO_STAGE, _addStage);
stage.addEventListener(MouseEvent.MOUSE_DOWN, _putPerticle);
addEventListener(Event.ENTER_FRAME, _onEnterFrame);
}
public function _putPerticle(e:MouseEvent):void
{
myColor = 0xFFFFFF * Math.random();
this.x = stage.stageWidth * Math.random();
this.y = stage.stageHeight * Math.random();
for( var i:uint=0; i<pointsNum; i++ )
{
particleArray[i].init();
particleArray[i].raranger();
}
}
private function setPoints():void
{
for( var i:uint=0; i<pointsNum; i++ )
{
pointsArray.push( {x:0, y:0} );
particleArray.push( new Particle() );
particleArray[i].init();
particleArray[i].raranger();
}
}
private function _onEnterFrame(e:Event):void
{
n += d;
shape.graphics.clear();
shape.graphics.beginFill( myColor, 1 );
shape.graphics.lineStyle(1,myColor,0.02);
for(var i:uint=0; i<pointsNum; i++)
{
particleArray[i]._onEnterFrame(null);
pointsArray[i].x = (particleArray[i].r) * Math.cos( (360 * i/pointsNum) * Math.PI / 180 );
pointsArray[i].y = (particleArray[i].r) * Math.sin( (360 * i/pointsNum) * Math.PI / 180 );
var y:Number = 1;
}
shape.graphics.moveTo((pointsArray[pointsArray.length-1].x + pointsArray[0].x) / 2, (pointsArray[pointsArray.length-1].y + pointsArray[0].y) / 2);
var pt1:Object;
var pt2:Object;
for(i=0; i<pointsNum; i++)
{
if(i==0) {
//shape.graphics.moveTo( pointsArray[i].x, pointsArray[i].y );
} else {
pt1 = pointsArray[i-1];
pt2 = pointsArray[i];
//shape.graphics.lineTo( pointsArray[i].x, pointsArray[i].y );
shape.graphics.curveTo( pt1.x, pt1.y, (pt1.x+pt2.x)/2, (pt1.y+pt2.y)/2 );
}
}
//shape.graphics.lineTo( pointsArray[pointsNum-1].x, 0 );
pt1 = pointsArray[pointsArray.length-1];
pt2 = pointsArray[0];
shape.graphics.curveTo(pt1.x,pt1.y, (pt1.x+pt2.x)/2, (pt1.y+pt2.y)/2 );
shape.graphics.endFill();
cnt++;
}
}
class Particle extends Sprite
{
public var nx:Number;
public var ny:Number;
public var vx:Number;
public var vy:Number;
public var r:Number;
public var rv:Number;
public var rvDeccel:Number;
public var rarange:Number;
public var pluser:Number;
private var minX:Number, minY:Number, maxX:Number, maxY:Number;
public function Particle()
{
super();
this.x = 0;
this.y = 0;
}
public function raranger():void
{
rarange = 0.1;
//拡大係数は拡大後縮小
Tweener.addTween( this, {pluser:0.5, time:1, transition:"easeOutElastic"} );
Tweener.addTween( this, {pluser:0, delay:1, time:10, transition:"easeOutElastic", onComplete:removeFrame} );
//ランダム係数も拡大後縮小だが、落とした最初は丸くしたいので少しずらす
Tweener.addTween( this, {rarange:3, time:1, delay:0.5, transition:"easeOutElastic"} );
Tweener.addTween( this, {rarange:0, time:0.2, delay:1.5, transition:"easeOutElastic"} );
}
private function removeFrame():void
{
}
public function _onEnterFrame(e:Event):void
{
rv = rv * rvDeccel + Math.random() * rarange + pluser;
r += rv;
vx = Math.cos( r * Math.PI / 180 ) * 20;
vy = Math.sin( r * Math.PI / 180 ) * 20;
nx += vx;
ny += vy;
this.x = nx;
this.y = ny;
}
/**
* init
*/
public function init():void
{
//nx = 0;
//ny = 0;
vx = 0;
vy = 0;
minX = 0;
minY = 0;
maxX = 500;
maxY = 500;
r = 0;
rv = 1;
rvDeccel = 0.8;
rarange = 0.1;
pluser = 0.1;
}
}