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.* ;
    
    [SWF(width="500", height="500", backgroundColor="0x33302E", frameRate="30")]
    public class Stardust2 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 var _yoyo:Yoyo ;
        
        public function Stardust2( )
        {
            init( ) ;
        }
        
        private function init( ):void
        {
            stage.scaleMode = StageScaleMode.NO_SCALE ;
            stage.align = StageAlign.TOP_LEFT ;
            // stage.quality = StageQuality.LOW ;
            
            _yoyo = new Yoyo( ) ;
            addChild( _yoyo ) ;
            
            addEventListener( Event.ENTER_FRAME, onRender );
        }
        
        public function xRotation( ):Number
        {
            return _rotation ;
        }
        
        private function onRender( event:Event ):void
        {
            if ( _prevX == _yoyo.x && _prevY == _yoyo.y )
            {
                return ;
            }
            
            _rotation = Math.atan2( _prevX - _yoyo.x, _prevY - _yoyo.y ) * 180 / Math.PI + 90 ;
            _prevX = _yoyo.x ;
            _prevY = _yoyo.y ;
            
            for ( var i:Number=0; i<3; i++ )
            {
                // パーティクルを生成
                var obj:StarSprite = new StarSprite( _distance, _move_spd, _clear_spd, _scale_spd, _rotation ) ;
                obj.x = _yoyo.x ;
                obj.y = _yoyo.y ;
                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++ ;
                }
            }
            
            // 常に最前面にする
            addChild( _yoyo ) ;
        }
        
        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.geom.* ;
import flash.filters.* ;

class Yoyo extends Sprite
{
    private const SPRING:Number = .1 ;
    private const FRICTION:Number = .9 ;
    private var _vect:Point ;
    private var _source:Sprite ;
    
    public function Yoyo( )
    {
        addEventListener( Event.ADDED_TO_STAGE, init ) ;
        addEventListener( Event.REMOVED_FROM_STAGE, unload ) ;
    }

    private function init( event:Event ):void
    {
        removeEventListener( Event.ADDED_TO_STAGE, init ) ;
        
        _source = new Sprite( ) ;
        x = stage.stageWidth / 2 ;
        y = stage.stageHeight / 2 ;
        _source.graphics.beginFill( 0x404da7) ;
        _source.graphics.drawCircle( 0, 0, 10 ) ;
        _source.graphics.endFill( ) ;
        addChild( _source ) ;
        
        _vect = new Point( 100 * Math.random( ) - 50, 100 * Math.random( ) - 50 ) ;
        
        filters= [ new BlurFilter( 10, 10, 3 ) ] ;
        //filters = [ new DropShadowFilter( 10, 45, 0x7c863d, 0.5, 5, 5, 5 ) ] ;
        
        addEventListener( Event.ENTER_FRAME, onRender ) ;
    }
    
    private function unload( event:Event = null ):void
    {
        removeEventListener( Event.REMOVED_FROM_STAGE, unload ) ;
        removeEventListener( Event.ENTER_FRAME, onRender ) ;
    }
    
    private function onRender( event:Event ):void
    {
        _vect.x += ( stage.mouseX - x ) * SPRING ;
        _vect.y += ( stage.mouseY - y ) * SPRING ;
        _vect.x *= FRICTION ;
        _vect.y *= FRICTION ;
        x += _vect.x ;
        y += _vect.y ;
    }
}



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( ) ;
        graphics.beginFill( 0x404da6);
        graphics.drawCircle( 0, 0, 4 ) ;
        graphics.drawCircle( 0, 0, 2 ) ;
        graphics.endFill( ) ;
        
        //filters = [ new DropShadowFilter( 10, 45, 0x7c863d, 0.5, 5, 5, 5 ) ] ;
        
        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 ) ) ;
        }
    }
}