flash on 2011-1-31

by omari
♥0 | Line 110 | Modified 2011-01-31 20:23:27 | MIT License
play

ActionScript3 source code

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

package {
import flash.display.Sprite;
import flash.utils.Timer;
import flash.utils.TimerEvent;

public class Spawn extends Sprite {
public function Spawn() {
          
var wind:Number = 0;
var grav:Number = .05;
var ground:Number = 700;
var friction:Number = .97;
var particleNum:Number = 0;
var particleMax:Number = 25;
var maxDistance:Number = 100;

var particles:Object = new Object();

var drawLayer:Sprite = new Sprite();
addChild(drawLayer);

//fscommand("fullscreen", "true");

function spawnParticle (event:TimerEvent) {
    
    var mag:Number = Math.random()*2;
    var dir:Number = Math.random()*Math.PI*2;
    
    particles["p"+particleNum] = {x:mouseX, y:mouseY,
                                    xSpeed:Math.cos(dir)*mag*0, 
                                    ySpeed:Math.sin(dir)*mag*0,
                                    radius:0,
                                    radiusIncrement:Math.random()*2,
                                    color:sampleBitmapData.getPixel(mouseX, mouseY)}
                                    
        
    if (particleNum>=particleMax) {
        delete particles["p"+(particleNum-particleMax)];
    }
    
    particleNum++;
        
        
}

function moveParticles (event:TimerEvent){
    
    //if (Math.random()<.05) wind = Math.random()*2-1;
    
    drawLayer.graphics.clear();
    //drawLayer.graphics.lineStyle(0, 0xFFFFFF, 1);
    
    var min:Number = particleNum-particleMax;
    if (min<0) min = 0;
    
    for (var c=min+1; c<particleNum-1; c++) {
        
        var p:Object  = particles["p"+c];
        var nb:Object = particles["p"+(c+1)];
        
        p.xSpeed += wind;
        p.ySpeed += grav;
        
        p.xSpeed *= friction;
        p.ySpeed *= friction;
        
        p.x += p.xSpeed;
        p.y += p.ySpeed;
        
        if (c<min+5) {
            p.x -= (p.x - nb.x)*.6;
            p.y -= (p.y - nb.y)*.6;
        } else {
            //p.xSpeed -= (p.x - nb.x)*.01;
            //p.ySpeed -= (p.y - nb.y)*.01;
            
        }
        
        if (c>particleNum-particleMax*.5) {
            p.radius += p.radiusIncrement;
        } else {
            p.radius *= .85;
        }
        
        
        
        if (p.y > ground) {
            p.y = ground;
            p.ySpeed *= -1;
        }
        
        var X:Number = p.x - nb.x;
        var Y:Number = p.y - nb.y;
        
        p.Distance = Math.sqrt(X*X+Y*Y);
        p.Angle = Math.atan2(Y, X);
        
        if (p.Distance>maxDistance) {
            var oldX:Number = p.x;
            var oldY:Number = p.y;
            
            p.x = nb.x + maxDistance * Math.cos(p.Angle);
            p.y = nb.y + maxDistance * Math.sin(p.Angle);
            
            p.xSpeed += (p.x-oldX) * .1;
            p.ySpeed += (p.y-oldY) * .1;

        }
        
    }
    
    // Draw line through all the points
    for (c=particleNum-2; c>min; c--) {
        
        p  = particles["p"+c];
        nb = particles["p"+(c-1)];
        var nbB:Object = particles["p"+(c+1)];
        
        //drawLayer.graphics.lineStyle(p.radius, 0x444444, 1);
        //drawLayer.graphics.lineStyle(1, 0x999999, 1);
        
        var midPointX:Number = p.x + (nb.x-p.x)*.5;
        var midPointY:Number = p.y + (nb.y-p.y)*.5;
        
        if (c == particleNum-2) {
            drawLayer.graphics.moveTo(p.x, p.y);
        } else if (c>min+1) {

            //drawLayer.graphics.curveTo(p.x, p.y, midPointX, midPointY);

            var p_a = {x:nbB.x+nbB.radius*Math.cos(nbB.Angle + Math.PI*.5), y:nbB.y+nbB.radius*Math.sin(nbB.Angle + Math.PI*.5)}
            var p_b = {x:nbB.x-nbB.radius*Math.cos(nbB.Angle + Math.PI*.5), y:nbB.y-nbB.radius*Math.sin(nbB.Angle + Math.PI*.5)}
            
            var p_c = {x:p.x+p.radius*Math.cos(p.Angle + Math.PI*.5), y:p.y+p.radius*Math.sin(p.Angle + Math.PI*.5)}
            var p_d = {x:p.x-p.radius*Math.cos(p.Angle + Math.PI*.5), y:p.y-p.radius*Math.sin(p.Angle + Math.PI*.5)}
            
            var p_e = {x:nb.x+nb.radius*Math.cos(nb.Angle + Math.PI*.5), y:nb.y+nb.radius*Math.sin(nb.Angle + Math.PI*.5)}
            var p_f = {x:nb.x-nb.radius*Math.cos(nb.Angle + Math.PI*.5), y:nb.y-nb.radius*Math.sin(nb.Angle + Math.PI*.5)}

            
            var p_ac = {x:p_a.x+(p_c.x-p_a.x)*.5, y:p_a.y+(p_c.y-p_a.y)*.5}
            var p_ce = {x:p_c.x+(p_e.x-p_c.x)*.5, y:p_c.y+(p_e.y-p_c.y)*.5}
            
            var p_bd = {x:p_b.x+(p_d.x-p_b.x)*.5, y:p_b.y+(p_d.y-p_b.y)*.5}
            var p_df = {x:p_d.x+(p_f.x-p_d.x)*.5, y:p_d.y+(p_f.y-p_d.y)*.5}
            
            p.color = sampleBitmapData.getPixel(p.x, p.y)
            
            drawLayer.graphics.lineStyle(1, 0x222222, .5);
            drawLayer.graphics.beginFill(p.color, .25);
            
            drawLayer.graphics.moveTo(p_bd.x, p_bd.y);
            drawLayer.graphics.curveTo(p_d.x, p_d.y, p_df.x, p_df.y);
            
            drawLayer.graphics.lineStyle(1, 0x222222, 0);
            drawLayer.graphics.lineTo(p_ce.x, p_ce.y);
            
            drawLayer.graphics.lineStyle(1, 0x222222, .5);
            drawLayer.graphics.curveTo(p_c.x, p_c.y, p_ac.x, p_ac.y);
            
            drawLayer.graphics.lineStyle(1, 0x222222, 0);
            drawLayer.graphics.lineTo(p_bd.x, p_bd.y);
            drawLayer.graphics.endFill();
            
            
            // End here, so it will pick up here.
            //drawLayer.graphics.moveTo(midPointX, midPointY);
            
            
        }
    }
    

        
}

var myTimer:Timer = new Timer(1000/10, 0);
myTimer.addEventListener("timer", spawnParticle);
myTimer.start();

var myTimerB:Timer = new Timer(1000/30, 0);
myTimerB.addEventListener("timer", moveParticles);
myTimerB.start();