1_09

by amashio
http://beautifl.net/book/
♥0 | Line 81 | Modified 2011-07-02 16:56:48 | MIT License
play

ActionScript3 source code

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

package{
    
    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.ColorTransform;
    import flash.geom.Rectangle;
    
    import net.hires.debug.Stats;
    
    [SWF(width=465, height=465,frameRate=30)]
    public class Main extends Sprite{
        
        private static const WIDTH:Number = 465;
        private static const HEIGHT:Number = 465;
        private var _canvas:BitmapData;
        //particle配列
        private var _particles:Vector.<Particle>;
        
        public function Main(){
            //カンバスの用意
            _canvas = new BitmapData(WIDTH, HEIGHT, false, 0x000000);
            addChild(new Bitmap(_canvas));
            
            _particles = new Vector.<Particle>();
            
            //配置する豆腐の用意
            for(var i:int = 0; i < 300; i++){
                
                for(var j:int = 0; j < 300; j++){
                    
                    _particles.push(new Particle(i+100, j+100));
                    
                }
                
            }
            
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
            stage.addEventListener(MouseEvent.CLICK, onClick);
            addChild(new Stats());
        }
        
        //毎フレームのこと
        private function onEnterFrame(event:Event):void{
            
            _canvas.lock();
            
            //色の移行を適用
            var cr:Rectangle = new Rectangle(0, 0, _canvas.width, _canvas.height);
            var ct:ColorTransform = new ColorTransform(0.9, 0.9, 0.9);
            _canvas.colorTransform(cr, ct);
            
            //
            for each(var p:Particle in _particles){
                
                p.vx *= 0.99;
                p.vy *= 0.99;
                p.x += p.vx;
                //もしparticleが範囲にはいったなら
                if(p.falled){
                    
                    p.vy += 0.05;
                    
                }
                
                //加速度をつける
                p.y += p.vy;
                _canvas.setPixel(p.x, p.y, p.color);
            }
            
            _canvas.unlock();
        }
        
        private function onClick(event:MouseEvent):void{
            
            var mouseX:Number = stage.mouseX;
            var mouseY:Number = stage.mouseY;
            
            for each(var p:Particle in _particles){
                
                var dx:Number = mouseX - p.x;
                var dy:Number = mouseY - p.y;
                var d:Number = Math.sqrt(dx * dx + dy * dy);
                var radian:Number = Math.atan2(dy, dx);
                var speed:Number = 300 / (d * d);
                p.vx += -Math.cos(radian) * speed;
                p.vy += -Math.sin(radian) * speed;
                
                //加速しているなら 消去
                if(speed > 1){
                    
                    p.color = 0xAAAAAA;
                    p.falled = true;
                
                }else{
                    
                    //powはval1のval2乗
                    var c:uint = Math.pow(1 - speed, 4) / 1 * 0xFF;
                    
                    //ここの&はビット論理演算子
                    //足し合わせ
                    if(c < (p.color & 0xFF)){
                        
                        p.color = (c << 16) | (c << 8) | c;
                        
                    }
                    
                }
            }
            
        }
    }
}

class Particle{
    
    public var x:Number;
    public var y:Number;
    public var vx:Number = 0;
    public var vy:Number = 0;
    public var color:Number = 0xFFFFFF;
    public var falled:Boolean = false;;
    
    public function Particle(x:Number, y:Number){
        this.x = x;
        this.y = y;
        
    }
}