数学--弹性应用。

package {
    import flash.display.Sprite;
    import flash.events.Event;
    public class Spring extends Sprite {
        private var ball:Ball ;
        private var spring:Number = 0.1;//弹性系数
        private var gravity:Number = 5;
        private var friction:Number = 0.95;//摩擦力系数
        private var vx:Number = 0;
        private var vy:Number = 0;        
        
        public function Spring () {
            init();
        }
        
        private function init():void
        {
            ball = new Ball();
            addChild(ball);
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        private function onEnterFrame(e:Event):void
        {
            var dx:Number = mouseX - ball.x ;
            var dy:Number = mouseY - ball.y ;
            var ax:Number = dx * spring;
            var ay:Number = dy * spring;
            vx += ax ;
            vy += ay ;
            vy += gravity ;
            vx *= friction;
            vy *= friction;
            ball.x += vx ;
            ball.y += vy ;
            graphics.clear();
            graphics.lineStyle(1);
            graphics.moveTo(mouseX, mouseY);
            graphics.lineTo(ball.x, ball.y);
        }
    }

}


、、making things move P164

----------------------拓展:弹性链

package {
    import flash.display.Sprite;
    import flash.events.Event;
    public class Spring extends Sprite {
        private var ballnumbers:int=10 ;
        private var spring:Number = 0.1;//弹性系数
        private var gravity:Number = 5;
        private var friction:Number = 0.8;//摩擦力系数        
        private var arr:Array ;
        
        public function Spring () {
            init();
        }
        
        private function init():void
        {
            arr = new Array();
            for (var i:int = 0; i < ballnumbers; i++ ) {
                var ball:Ball = new Ball(10);
                addChild(ball);
                arr.push(ball);
            }
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        private function onEnterFrame(e:Event):void {
            graphics.clear();
            graphics.lineStyle(1);
            graphics.moveTo(mouseX, mouseY);
            moveBall( mouseX, mouseY,arr[0]);
            graphics.lineTo(arr[0].x, arr[0].y);
            
            for (var i:int = 1; i < ballnumbers; i++ ) {
                var ballA:Ball = arr[i-1];
                var ballB:Ball = arr[i];
                moveBall( ballA.x, ballA.y,ballB);
            }
        }
        
        private function moveBall(targetX:Number,targetY:Number,ball:Ball):void
        {
            var dx:Number =  targetX - ball.x;
            var dy:Number =  targetY  - ball.y ;
            var ax:Number = dx * spring;
            var ay:Number = dy * spring;
            ball.vx += ax ;
            ball.vy += ay ;
            ball.vy += gravity ;
            ball.vx *= friction;
            ball.vy *= friction;
            ball.x += ball.vx;
            ball.y += ball.vy;
            
            graphics.lineTo(ball.x, ball.y);
        }
    }
}


//修改了函数的参数部分,我认为这样更好理解,都是以前面的球作为主导,前的坐标减去后的坐标,参数也可以提供两个球,在enter中把第一个球的坐标设置成mouseX mouseY,原参数是考虑到第一个 鼠标的坐标。为了一个改变剩余的全部。


---------------拓展二 多目标弹性

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    public class Spring extends Sprite {
        private var ball:Ball;
        private var arr:Array;
        private var friction:Number = 0.8;
        private var spring:Number = 0.1;
        private var balls:Number = 3;
        
        public function Spring () {
            init();
        }
        
        private function init():void
        {
            ball = new Ball(20);
            addChild(ball);
            
            arr = new Array();
            for (var i:int = 0; i < balls; i++ ) {
                var handle:Ball = new Ball(10, 0x0000ff);
                handle.x = Math.random() * stage.stageWidth;
                handle.y = Math.random() * stage.stageHeight;
                handle.addEventListener(MouseEvent.MOUSE_DOWN, onDrag);
                addChild(handle);
                arr.push(handle);
            }
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
            addEventListener(MouseEvent.MOUSE_UP, onRelease);
        }
        
        private function onRelease(e:MouseEvent):void
        {
            stopDrag();
        }
        
        private function onDrag(e:MouseEvent):void
        {
            e.target.startDrag();
        }
        
        private function onEnterFrame(e:Event):void {
            for (var i:int = 0; i < balls ; i++ ) {
                var handle:Ball = arr[i] as Ball;
                var dx:Number = handle.x - ball.x;
                var dy:Number = handle.y - ball.y ;
                ball.vx += dx * spring;
                ball.vy += dy * spring;
            }
            
            ball.vx *= friction;
            ball.vy *= friction;
            ball.x += ball.vx;
            ball.y += ball.vy;
            
            graphics.clear();
            graphics.lineStyle(1);
            for (var j:int = 0 ; j < balls ; j ++ ) {
                graphics.moveTo(ball.x, ball.y );
                graphics.lineTo(arr[j].x, arr[j].y);
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值