分享

Flash AS3.0制作飘动的气泡内含详细注释

 灵岩侠客 2011-09-12
Flash AS3.0制作飘动的气泡内含详细注释
本帖最后由 athenaflash 于 2011-3-28 11:52 编辑

最近在网上发现了一个很不错的气泡漂浮代码,经验证没有任何错误。
效果:多个小气泡在屏幕上自由飘动,当气泡与气泡,气泡与边框碰撞的时候都会作出相应的动作。

                function ball(r:int):MovieClip {
//自定义函数 ball,参数为 r,整数型,返回值为 MovieClip  

        var col:uint=0xffffff*Math.random();
//声明一个无符号整数型变量 col,获取任意颜色  

        var sh:MovieClip=new MovieClip();
//声明一个影片剪辑类实例 sh  

        sh.graphics.beginGradientFill(GradientType.LINEAR,[0xffffff,col,col],[0.5,0.5,1],[0,200,255]);
//在 sh 中设置渐变填充样式(放射状渐变,颜色,透明度,色块位置)  

        sh.graphics.drawCircle(0,0,r);
//在 sh 中画圆(圆心坐标(0,0),半径为参数r)  

        sh.graphics.endFill();
//结束填充  

        return sh;
//返回 sh  

}

var ballArr:Array=[];
//声明一个空数组 ballArr  

for (var i:int=0; i<10; i++) {
//创建一个 for 循环,循环 10次  

        var balls:MovieClip=ball(Math.random()*20+20);
//声明一个影片剪辑类实例balls,调用函数 ball(参数r 半径的值为 20-40 之间的随机值)  

        addChild(balls);
//把 balls添加到显示列表  

        balls.x=Math.random()*(stage.stageWidth-balls.width)+balls.width/2;
//balls 的 X 坐标  

        balls.y=Math.random()*(stage.stageHeight-balls.height)+balls.height/2;
//balls 的 Y坐标,使它出现在舞台的任意位置  

        balls.vx=Math.random()*2-1;
//为 balls 设置自定义属性 vx,数值为-1-1 之间的随机数,表示 X 方向的速度  

        balls.vy=Math.random()*2-1;
//为 balls 设置自定义属性 vy,数值为-1-1 之间的随机数,表示 Y 方向的速度  

        ballArr.push(balls);
//把 balls 添加到数组 ballArr 中  

}

addEventListener(Event.ENTER_FRAME,frame);
//添加帧频事件侦听,调用函数 frame  

function frame(e) {//定义帧频事件函数 frame  

        for (var i:int=0; i<ballArr.length; i++) {
//创建一个 for循环,循环次数为数组 ballArr 的元素数  

                var balls:MovieClip=ballArr;
//声明一个影片剪辑类实例 balls,获取数组 ballArr 的元素

                balls.x+=balls.vx;
//balls的 X 坐标每帧增加balls.vx  

                balls.y+=balls.vy;
//balls的 Y 坐标每帧增加balls.vy  

                if (balls.x<balls.width/2) {
//如果balls 出了舞台左边缘  

                        balls.x=balls.width/2;
//balls 的 X坐标获取balls 宽度的一半  

                        balls.vx*=-1;//ba
lls.vx 获取它的相反数  

                }

                if (balls.x>stage.stageWidth-balls.width/2) {
//如果 alls 出了舞台右边缘  

                        balls.x=stage.stageWidth-balls.width/2;
//balls 的 X 坐标获取场景宽度与 balls 宽度一半的差  

                        balls.vx*=-1;
//balls.vx 获取它的相反数  

                }

                if (balls.y<balls.height/2) {
//如果 balls出了舞台上边缘  

                        balls.y=balls.height/2;
//balls 的 Y坐标获取 balls 高度的一半  

                        balls.vy*=-1;//balls.vy 获取它的相反数  

                }

                if (balls.y>stage.stageHeight-balls.height/2) {
//如果 balls 出了舞台下边缘  

                        balls.y=stage.stageHeight-balls.height/2;
//balls 的 Y 坐标获取舞台高度与 balls 高度一半的差  

                        balls.vy*=-1;
//balls.vy 获取它的相反数  

                }

        }

        for (var j:int=0; j<ballArr.length-1; j++) {
//创建一个 for 循环,循环次数比数组 ballArr 元素数少 1  

                var ball0:MovieClip=ballArr[j];
//声明一个影片剪辑类实例 ball0,获取数组 ballArr 的元素  

                for (var m:int=j+1; m<ballArr.length; m++)
{
//创建一个 for 循环,  

                        var ball1:MovieClip=ballArr[m];
//声明一个影片剪辑类实例 ball1,获取数组 ballArr 的元素  

                        var dx:Number=ball1.x-ball0.x;
//声明一个数值型变量 dx,获取  

                        var dy:Number=ball1.y-ball0.y;
//声明一个数值型变量 dy,获取  

                        var jl:Number=Math.sqrt(dx*dx+dy*dy);
//声明一个数值型变量 jl,获取小球的距离  

                        var qj:Number=ball0.width/2+ball1.width/2;
//声明一个数值型变量获取小球半径之和  

                        if (jl<=qj)
{
//如果 jl 小于等于 qj  

                                var angle:Number=Math.atan2(dy,dx);
//声明一个数值型变量angle,获取ball1 相对于 ball0 的角度  

                                var tx:Number=ball0.x+Math.cos(angle)*qj*1.01;
//声明一个数值型变量 tx,获取目标点的 X坐标  

                                var ty:Number=ball0.y+Math.sin(angle)*qj*1.01;
//声明一个数值型变量 ty,获取目标点的 Y坐标

                                ball0.vx=- (tx-ball1.x);
//ball0 在X 方向的速度  

                                ball0.vy=- (ty-ball1.y);
//ball0 在Y 方向的速度  

                                ball1.vx=(tx-ball1.x);
//ball1 在 X方向的速度  

                                ball1.vy=(ty-ball1.y);
//ball1 在 Y方向的速度  

                        }

                }

        }

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多