效果以下: canvas
var canvas = document.getElementById('canvas1');
var context = canvas.getContext('2d'); //获取2d环境下的画布上下文(获取一个画笔)
var cX = canvas.width / 2;
var cY = canvas.height / 2;
var r = 10;
setInterval(function() {
context.beginPath();
cX += 2;
cY += 2;
context.arc(cX, cY, r, 0, 2 * Math.PI);
context.fillStyle = 'red';
context.fill();
}, 1000 / 20);
复制代码
以上代码存在一个问题,即画出来的圆不断生成 数组
context.clearRect(0, 0, canvas.width, canvas.height);
复制代码
var canvas = document.getElementById('canvas1');
var context = canvas.getContext('2d'); //获取2d环境下的画布上下文(获取一个画笔)
var setArr = []; //存放圆形的数组
var maxNum = 30; //生成圆形数量的最大值
/*绘制随机的圆*/
var timer1 = setInterval(function() {
/*为了控制浏览器的性能,避免圆形不断地生成,影响性能*/
if (setArr.length > maxNum) {
clearInterval(timer1);
}
var cX = 200 + Math.ceil(Math.random() * 400); //生成200-400之间圆的x坐标
var cY = 200 + Math.ceil(Math.random() * 400); //生成200-400之间圆的y坐标
var r = 5 + Math.ceil(Math.random() * 10); //5-12之间圆的半径
/*生成rgba颜色的值*/
var red = Math.floor(Math.random() * 256);
var green = Math.floor(Math.random() * 256);
var blue = Math.floor(Math.random() * 256);
var alpha = 0.5 + Math.random() * 0.3;
var bgColor = 'rgba(' + red + ',' + green + ',' + blue + ',' + alpha + ')';
/*设置速度*/
var sX = -2 + Math.ceil(Math.random() * 8);
var sY = -2 + Math.ceil(Math.random() * 8);
var obj = {
cX: cX,
cY: cY,
r: r,
sX: sX,
sY: sY,
bgColor: bgColor
};
/*避免出现圆形出如今原地 没有动画效果*/
if (sX != 0 || sY != 0) {
setArr.push(obj);
}
}, 1000/20);
/*控制随机圆的动效 一秒钟执行60次*/
setInterval(function() {
/*每次绘制一个圆都要清空画布,不然每一个圆都会链接在一块儿造成直线*/
context.clearRect(0, 0, canvas.width, canvas.height);
for (var i = 0; i < setArr.length; i++) {
if(setArr[i].cY + setArr[i].r >= canvas.height || setArr[i].cY - setArr[i].r <= 0){
// 触碰上下边界
setArr[i].sY *= -1;
}
if(setArr[i].cX + setArr[i].r >= canvas.width || setArr[i].cX - setArr[i].r <= 0){
// 触碰左右边界
setArr[i].sX *= -1;
}
/*绘制一个圆形*/
setArr[i].cX += setArr[i].sX;
setArr[i].cY += setArr[i].sY;
context.beginPath();
context.arc(setArr[i].cX, setArr[i].cY, setArr[i].r, 0, 2 * Math.PI);
context.fillStyle = setArr[i].bgColor;
context.fill();
}
}, 1000/60);
复制代码
在开发过程当中遇到的问题:浏览器
一、生成的多个粒子部分在原位不动,没有任何变化bash
二、粒子如何反弹?dom
第一个解决办法,则是当速度都不为0的时候才把粒子添加到setArr数组中性能
/*避免出现圆形出如今原地 没有动画效果*/
if (sX != 0 || sY != 0) {
setArr.push(obj);
}
复制代码
第二个问题分析,以下图所示,当具备如下状况的时候进行反弹: 动画
for (var i = 0; i < setArr.length; i++) {
if(setArr[i].cY + setArr[i].r >= canvas.height || setArr[i].cY - setArr[i].r <= 0){
// 触碰上下边界
setArr[i].sY *= -1;
}
if(setArr[i].cX + setArr[i].r >= canvas.width || setArr[i].cX - setArr[i].r <= 0){
// 触碰左右边界
setArr[i].sX *= -1;
}
}
复制代码