In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

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

    }
//}