スポンサーサイト

-------- | --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ActionScript 3.0] 雪(2)

2007-08-16 | 20:55

マウスを置く場所によって、雪の動きが変わります。

package{
    import flash.display.*;
    import flash.events.*;

    [SWF(width="292", height="438",backgroundColor="0x0")]
        public class ParticleSimulator extends Sprite{
            private static var GRAVITY:Number = 9.8;
            private static var ro:Number = 1.205;
            private static var nyu:Number = 0.00001512;

            private static var w:int = 292;
            private static var h:int = 438;

            [Embed(source="yak0061-022.jpg")]
                private var myImage:Class;

            public function ParticleSimulator(){
                var bitmap:Bitmap = new myImage();
                addChild(bitmap);
                for(var i:int = 0 ; i < 100 ; i++){
                    var l:Number = Math.random() * 0.000005;
                    var p:Particle = new Particle(l*1500000);
                    p.x = w*Math.random();
                    p.y = h*Math.random();
                    p.alpha = Math.random()/2 + 0.4;
                    p.diameter = l;
                    p.mass = l * 10;
                    addChild(p);
                    p.addEventListener(Event.ENTER_FRAME, loop);
                }
            }
            public function loop(e:Event):void{
                var p:Particle = Particle(e.target);
                p.t++;
                p.vy =  Math.pow((p.mass * GRAVITY) / (3 * Math.PI * ro * nyu * p.diameter),
                        (1 - Math.exp(-3*Math.PI*ro*nyu* p.diameter * p.t/ p.mass)));
                //p.x += 1;
                p.y += p.vy;

                // マウスからの距離
                var distance:Number = Math.sqrt((mouseX - p.x)*(mouseX - p.x) + (mouseY-p.y)*(mouseY-p.y));
                // 加速度(距離が近いほど大きく、質量が大きいほど小さく)
                p.ax = (400 / distance) * 0.1 / (p.mass * 1000000);
                if(mouseX > p.x)
                    p.ax *= -1;
                p.vx += p.ax;
                p.x += p.vx;
                if(p.x > w || p.y > h){
                    p.x = w*Math.random();
                    p.vx = p.ax = 0;
                    p.y = 0;
                    p.t = 0;
                }
            }
        }
}

package {
    import flash.display.Sprite;

    public class Particle extends MovingObject {
        public var mass:Number = 1;
        public var diameter:Number = 1;
        public var t:int = 0;
        public function Particle(rad:Number) {
            //graphics.lineStyle(0, 0, 1);
            graphics.beginFill(0xffffff);
            graphics.drawCircle(0,0,rad);
            graphics.endFill();
        }
    }
} 
package {
    import flash.display.Sprite;

    public class MovingObject extends Sprite {
        private var _vx:Number =0;
        private var _vy:Number =0;
        private var _ax:Number =0;
        private var _ay:Number =0;

        public function get vx():Number{
            return _vx;
        }

        public function set vx(v:Number):void{
            _vx = v;
        }

        public function get vy():Number{
            return _vy;
        }

        public function set vy(v:Number):void{
            _vy = v;
        }

        public function get ax():Number{
            return _ax;
        }

        public function set ax(v:Number):void{
            _ax = v;
        }

        public function get ay():Number{
            return _ay;
        }

        public function set ay(v:Number):void{
            _ay = v;
        }
    }
} 

スポンサーサイト

Comment

Post a comment

Secret

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。