flash on 2011-6-29

by yama3
♥0 | Line 124 | Modified 2011-06-29 15:24:51 | MIT License
play

ActionScript3 source code

/**
 * Copyright yama3 ( http://wonderfl.net/user/yama3 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/8Kdt
 */

package {
    import flash.geom.ColorTransform;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Point;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.filters.ColorMatrixFilter;
    
    [SWF(width="465", height="465", frameRate="60")]
    
    public class FlashTest extends Sprite {
        private var prev:Point;
        private var moveSize:Number;
        private var particleList:/*Particle*/Array;
        
        private var sprite:Sprite;
        private var canvas:BitmapData;
        private var filter:ColorMatrixFilter;
        
        public function FlashTest() {
            if(stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);            
        }
        
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            graphics.beginFill(0);
            graphics.drawRect(0, 0, 465, 465);
            graphics.endFill();
            
            sprite = new Sprite();
            canvas = new BitmapData(465, 465, true, 0);
            addChild(new Bitmap(canvas));
            
            moveSize = 0;
            particleList = [];
            
            filter = new ColorMatrixFilter([
                1, 0, 0, 0, 0,
                0, 1, 0, 0, 0,
                0, 0, 1, 0, 0,
                0, 0, 0, 0.99, 0
            ]);
            
            addEventListener(Event.ENTER_FRAME, EnterFrameHandler);
        }
        
        private function EnterFrameHandler(e:Event):void
        {
            if(prev == null)
            {
                prev = new Point(stage.mouseX, stage.mouseY);
            }
            var sx:Number = stage.mouseX - prev.x;
            var sy:Number = stage.mouseY - prev.y;
            var i:int;
            
            for(i = particleList.length - 1; i >= 0; i--)
            {
                if(particleList[i].life == 0) particleList.splice(i, 1);
            }
            for(i = particleList.length - 1; i >= 0; i--)
            {
                particleList[i].prevX = particleList[i].x;
                particleList[i].prevY = particleList[i].y;
                particleList[i].x += particleList[i].mx;
                particleList[i].y += particleList[i].my;
                
                particleList[i].life--;
                
                if(particleList[i].life == 0) {
                    if(particleList[i].generation < Particle.MAX_GENERATION)
                    {
                        for(var j:int = 0; j < 3; j++)
                        {
                            particleList.push(CreateParticle(particleList[i], particleList[i].x, particleList[i].y, particleList[i].mx, particleList[i].my));
                        }
                    }
                }
            }
            
            moveSize += Math.sqrt(sx * sx + sy * sy);
            if(moveSize > 10)
            {
                particleList.push(CreateParticle(null, stage.mouseX, stage.mouseY, sx, sy));
                moveSize = 0;
            }
            
            sprite.graphics.clear();
            
            for(i = 0; i < particleList.length; i++)
            {
                sprite.graphics.lineStyle(1 + (Particle.MAX_GENERATION - particleList[i].generation), 0xffffff);
                sprite.graphics.moveTo(particleList[i].prevX, particleList[i].prevY);
                sprite.graphics.lineTo(particleList[i].x, particleList[i].y);
            }
            
            sprite.graphics.lineStyle(5, 0xffffff);
            sprite.graphics.moveTo(stage.mouseX, stage.mouseY);
            sprite.graphics.lineTo(prev.x, prev.y);
            
            canvas.lock();
            canvas.applyFilter(canvas, canvas.rect, new Point(), filter);
            
            canvas.draw(sprite);
            canvas.unlock();
            
            prev.x = stage.mouseX;
            prev.y = stage.mouseY;
        }
        
        private function GetParticleLife(generation:int):int
        {
            return (Particle.MAX_GENERATION - generation) * 5 + 2;
        }
        
        private function CreateParticle(parent:Particle, x:Number, y:Number, vecX:Number, vecY:Number):Particle
        {
            var particle:Particle = new Particle();
            particle.prevX = particle.x = x;
            particle.prevY = particle.y = y;
            if(parent == null) particle.generation = 0;
            else particle.generation = parent.generation + 1;
            particle.life = GetParticleLife(particle.generation) * (Math.random() * 160 - 80);
            var speedrate:Number = Math.random();
            particle.mx = Math.cos(particle.angle * Math.PI / 180) * 6 * speedrate;
            particle.my = Math.sin(particle.angle * Math.PI / 180) * 6 * speedrate;
            return particle;            
        }
    }
}

class Particle {
    public static const MAX_GENERATION:int = 4;
    
    public var x:Number;
    public var y:Number;
    public var prevX:Number;
    public var prevY:Number;
    public var generation:int;
    public var life:int;
    
    public var mx:Number;
    public var my:Number;
    public var angle:Number;
}