canvas练习之躁动的小球

1.绘制若干个小球

2.让每个小球都是些碰壁反弹

3.当两个小球之间的距离到达指定长度时,在这两个小球中间绘制一条线。

由于每个小球的碰壁反弹都需要坐标、半径、颜色、速度等值,且每个小球的这鞋值都不一样,如果使用普通的变量,那就需要大量的代码实现,所以我们可以结合面向对象的编程思想,实现这样的效果。

html:

script:

// 获取画布

var canv =document.getElementById('canv');

// 获取画笔

var ctx =canv.getContext('2d');

//承接所有的小球的数组

var    ballArr =[];

// 随机数函数

function rn(min,max) {

return Math.round(Math.random()*(max-min))+min;

}

// 封装一个小球类

function Ball(ox,oy,r,bg,vx,vy) {

// 添加公有属性

    this.x = ox;

this.y = oy;

this.r = r;

this.bg = bg;

this.vx = vx;

this.vy = vy;

}

// 为小球类添加原型方法

Ball.prototype.move =function() {

// this指向当前调用move函数的这个对象(从类中实例化的对象才可以调用)

// 改变x,y让小球重新绘制

    this.x +=this.vx;

this.y +=this.vy;

// 绘制

    ctx.beginPath();

ctx.fillStyle =this.bg;

ctx.arc(this.x,this.y,this.r,0,2*Math.PI);

ctx.fill();

// 根据当前的x和y,判断是否需要反弹(改变vx,vy)

    if(this.x 1000 -this.r)

this.vx *= -1;

if(this.y 600 -this.r)

this.vy *= -1;

};

// 实例化若干个小球

function getBall() {

for(var i =0;i<200;i++) {

var r =rn(3,6);

var x =rn(r,1000-r);

var y =rn(r,600-r);

var vx =rn(-5,5);

var vy =rn(-5,5);

// 规避vx,vy为0的情况

        vx =vx ==0 ? -1 :vx;

vy =vy ==0 ?1 :vy;

var bg ='rgba('+rn(0,255)+','+rn(0,255)+',' +rn(0,255)+','+Math.random()+')';

var ball =new Ball(x,y,r,bg,vx,vy);

ballArr.push(ball);

}

}

getBall();

var mx;

var my;

canv.onmousemove =function (e) {

var ev =event || e;

mx =ev.offsetX;

my =ev.offsetY;

}

// 小球的圆心距满足指定条件,画线

function drawLine() {

for (var i =0;i

for (j =i +1;j

// 判断呢ballArr[i]和ballArr[j]

            var a =ballArr[i];

var d =Math.sqrt(Math.pow(a.x -mx,2) +Math.pow(a.y -my,2));

if (d <=100) {

ctx.beginPath();

ctx.strokeStyle ='rgba(' +rn(255,0) +',' +rn(255,0) +',' +rn(255,0) +',' +rn(1,0.2) +')';

ctx.moveTo(mx,my);

ctx.lineTo(a.x,a.y);

ctx.stroke()

var b =ballArr[j];

// 圆心距

                var distance =Math.sqrt(Math.pow(a.x -b.x,2) +Math.pow(a.y -b.y,2));

// 圆心距小于指定范围画线

                if (distance <=50) {

ctx.beginPath();

ctx.strokeStyle ='rgba(' +rn(0,255) +',' +rn(0,255) +',' +rn(0,255) +',' +Math.random() +')';

ctx.moveTo(a.x,a.y);

ctx.lineTo(b.x,b.y);

ctx.stroke();

}

}

}

}

}

// 频率绘制函数

function draw() {

ctx.clearRect(0,0,1000,600);// 清除画布

// 让所有小球都移动

    for(var i inballArr){

ballArr[i].move();

}

drawLine();

requestAnimationFrame(draw);

}

draw();

你可能感兴趣的:(canvas练习之躁动的小球)