forked from: マウスの軌跡にパーティクルを出す+光るリボン
マウスの軌跡にハートを出しつつ、ラインをエフェクトで。
// forked from twistcube's マウスの軌跡にパーティクルを出す
////////////////////////////////////////////////////////////////////////////////
//
// マウスの軌跡にパーティクルを出す
//
////////////////////////////////////////////////////////////////////////////////
package
{
import flash.display.* ;
import flash.events.* ;
import flash.net.* ;
import flash.system.* ;
import flash.filters.BlurFilter;
import flash.geom.Point;
import flash.geom.ColorTransform;
[SWF(width="1200", height="800", backgroundColor="0x000000", frameRate="30")]
public class Stardust extends Sprite
{
private var _distance:Object = { min:200, max:300 } ; // 落ちる距離
private var _move_spd:Object = { min:0.01, max:0.03 } ; // 落ちる速さ
private var _clear_spd:Object = { min:0.02, max:0.06 } ; // 消える速さ
private var _scale_spd:Object = { min:0.02, max:0.06 } ; // 拡大/縮小する速さ
private var _rotation:Number = 0 ;
private var _prevX:Number = 0 ;
private var _prevY:Number = 0 ;
private var _renderCount:uint = 0 ;
private const WIDTH:Number = 1200;
private const HEIGHT:Number = 800;
private var _sketch:CurveSketch;
private var _bmd:BitmapData;
private var _bm:Bitmap;
private var _container:Sprite = new Sprite();
public function Stardust( )
{
init( ) ;
}
private function init( ):void
{
stage.scaleMode = StageScaleMode.NO_SCALE ;
stage.align = StageAlign.TOP_LEFT ;
// stage.quality = StageQuality.LOW ;
graphics.beginFill(0)
graphics.drawRect(0, 0, WIDTH, HEIGHT)
graphics.endFill()
addChild(_container);
//
_sketch = new CurveSketch();
_bmd = new BitmapData(WIDTH, HEIGHT, true, 0);
_container.addChild(_sketch);
_container.addChild(_bm = new Bitmap(_bmd) as Bitmap);
_bm.blendMode = "add";
addEventListener( Event.ENTER_FRAME, onRender );
}
public function xRotation( ):Number
{
return _rotation ;
}
private function onRender( event:Event ):void
{
_bmd.draw(_sketch, null, null, "add");
_bmd.applyFilter(_bmd, _bmd.rect, new Point(), new BlurFilter(8, 8, 3));
if ( _prevX == mouseX && _prevY == mouseY )
{
return ;
}
_rotation = Math.atan2( _prevX - mouseX, _prevY - mouseY ) * 180 / Math.PI + 90 ;
_prevX = mouseX ;
_prevY = mouseY ;
for ( var i:Number=0; i<1; i++ )
{
// パーティクルを生成
var obj:StarSprite = new StarSprite( _distance, _move_spd, _clear_spd, _scale_spd, _rotation ) ;
obj.x = mouseX ;
obj.y = mouseY ;
obj.addEventListener( Event.COMPLETE, onComplete ) ;
addChild( obj ) ;
// 4個に1個だけ大きくする
if ( _renderCount == 4 )
{
obj.scaleX = obj.scaleY = Math.random( ) * 2 + 0.8 ;
_renderCount = 0 ;
}
else
{
obj.scaleX = obj.scaleY = Math.random( ) * .4 + .4 ;
_renderCount++ ;
}
}
}
private function onComplete( event:Event ):void
{
var obj:StarSprite = event.target as StarSprite ;
removeChild( obj ) ;
obj = null ;
}
}
}
import flash.display.* ;
import flash.events.* ;
import flash.filters.* ;
class StarSprite extends Sprite
{
private var _distance:Number ; // 落ちる距離
private var _move_spd:Number ; // 落ちる速さ
private var _clear_spd:Number ; // 消える速さ
private var _scale_spd:Number ; // 拡大/縮小する速さ
private var _rotation:Number ;
private var _vx:Number ;
private var _vy:Number ;
public function StarSprite( _distance:Object, _move_spd:Object, _clear_spd:Object, _scale_spd:Object, _rotation:Number ):void
{
this._distance = _distance.min + Math.random( ) * ( _distance.max - _distance.min ) ;
this._move_spd = _move_spd.min + Math.random( ) * ( _move_spd.max - _move_spd.min ) ;
this._clear_spd = _clear_spd.min + Math.random( ) * ( _clear_spd.max - _clear_spd.min ) ;
this._scale_spd = _scale_spd.min + Math.random( ) * ( _scale_spd.max - _scale_spd.min ) ;
this._rotation = _rotation ;
addEventListener( Event.ADDED_TO_STAGE, init ) ;
addEventListener( Event.REMOVED_FROM_STAGE, unload ) ;
}
private function init( event:Event ):void
{
removeEventListener( Event.ADDED_TO_STAGE, init ) ;
graphics.clear( ) ;
var hart:Sprite = new Sprite();
var g:Graphics = hart.graphics;
g.lineStyle(10,0xf12899,1.0,false,LineScaleMode.NORMAL,CapsStyle.ROUND,JointStyle.MITER);
g.moveTo(0,0);
g.lineTo(5,5);
g.lineTo(10,0);
addChild(hart);
// graphics.beginFill( 0xf12899 );
// graphics.drawCircle( 0, 0, 10 ) ;
// graphics.endFill( ) ;
filters = [ new BlurFilter( 2, 2, BitmapFilterQuality.MEDIUM) ] ;
xAction( ) ;
}
private function unload( event:Event = null ):void
{
removeEventListener( Event.REMOVED_FROM_STAGE, unload ) ;
removeEventListener( Event.ENTER_FRAME, onRender ) ;
}
private function xAction( ):void
{
var rot:Number = _rotation + Math.random( ) * 120 - 60 ;
var theta:Number = rot * Math.PI / 180 ;
_vx = x - Math.cos( theta ) * _distance ;
_vy = y + Math.sin( theta ) * _distance ;
addEventListener( Event.ENTER_FRAME, onRender ) ;
}
private function onRender( event:Event ):void
{
x += ( _vx - x ) * _move_spd ;
y += ( _vy - y ) * _move_spd ;
alpha -= _clear_spd ;
scaleX += _scale_spd ;
scaleY += _scale_spd ;
if ( alpha < 0 )
{
dispatchEvent( new Event( Event.COMPLETE ) ) ;
}
}
}
//package {
import frocessing.display.F5MovieClip2D;
import frocessing.geom.FGradientMatrix;
import frocessing.color.ColorHSV
class CurveSketch extends F5MovieClip2D
{
//加速度運動の変数
//位置
private var xx:Number;
private var yy:Number;
//速度
private var vx:Number;
private var vy:Number;
//加速度の係数
private var ac:Number;
//速度の減衰係数
private var de:Number;
//描画座標
private var px0:Array;
private var py0:Array;
private var px1:Array;
private var py1:Array;
private var t:Number = 0
//描画グループ
private var shapes:Array;
public function CurveSketch()
{
//初期化
vx = vy = 0.0;
xx = mouseX;
yy = mouseY;
ac = 0.06;
de = 0.9;
px0 = [xx, xx, xx, xx];
py0 = [yy, yy, yy, yy];
px1 = [xx, xx, xx, xx];
py1 = [yy, yy, yy, yy];
shapes = [];
//線と塗りの色指定
noStroke();
}
public function draw():void
{
//加速度運動
xx += vx += ( mouseX - xx ) * ac;
yy += vy += ( mouseY - yy ) * ac;
var len:Number = mag( vx, vy );
//新しい描画座標
var x0:Number = xx + 1 + len * 0.1;
var y0:Number = yy - 1 - len * 0.1;
var x1:Number = xx - 1 - len * 0.1;
var y1:Number = yy + 1 + len * 0.1;
//描画座標
px0.shift(); px0.push( x0 );
py0.shift(); py0.push( y0 );
px1.shift(); px1.push( x1 );
py1.shift(); py1.push( y1 );
var _px0:Array = [px0[0], px0[1], px0[2], px0[3]];
var _py0:Array = [py0[0], py0[1], py0[2], py0[3]];
var _px1:Array = [px1[0], px1[1], px1[2], px1[3]];
var _py1:Array = [py1[0], py1[1], py1[2], py1[3]];
shapes.push( { px0:_px0, py0:_py0, px1:_px1, py1:_py1, mtx:null} );
if (shapes.length >= 50) shapes.shift();
var shapesLength:int = shapes.length;
for (var i:int = shapesLength-1; i >= 0; i--)
{
var sh:Object = shapes[i];
var color:ColorHSV = new ColorHSV(t, 0.8, 1, 0.1)
t += 0.05;
beginFill(int(color), 0.2)
beginShape();
curveVertex( sh.px0[0], sh.py0[0] );
curveVertex( sh.px0[1], sh.py0[1] );
curveVertex( sh.px0[2], sh.py0[2] );
curveVertex( sh.px0[3], sh.py0[3] );
vertex( sh.px1[2], sh.py1[2] );
curveVertex( sh.px1[3], sh.py1[3] );
curveVertex( sh.px1[2], sh.py1[2] );
curveVertex( sh.px1[1], sh.py1[1] );
curveVertex( sh.px1[0], sh.py1[0] );
endShape();
}
//減衰処理
vx *= de;
vy *= de;
}
}
//}