作者: 风小锐 新浪微博ID:永远de风小锐 QQ:547953539 转载请注明出处
今天浏览CSDN博客,发现了whqet编写的《CreateJS奥运五环动画》,发现效果十分炫酷,原文使用了CreateJS库,对于不熟悉这个库的我来说,要读懂其中的代码着实有些费劲。作为一个刚接触JavaScript的菜鸟来说,我开始尝试使用纯HTML5和JavaScript函数来实现这个效果,经过了几个小时的编写,终于实现了所要的效果,在这里把代码分享给大家,希望能对大家有所帮助。
效果图如下:
图片是静态的,没法领略其中的神韵,感兴趣的同学可以拷贝下面的代码到浏览器中运行。
由于代码中注释的比较详细,我不具体解释,简单地介绍一下其中需要注意的几点:
1.环的对象放在全局变量数组中,粒子存储在每个环的粒子数组中。
2.粒子到环圆心的距离要加上一个随机的偏移量offset,这样效果会更好。
3.粒子的大小在一个范围内取随机值,颜色在设定的几种中取随机值。
下面附上代码,有问题欢迎在下面评论和我的新浪微博与我谈论:
<html> <head> <title>My Olympic Logo</title> <script type="text/javascript"> //==================================================== // Name: olympic_logo.html // Des: 不断转动的水彩五环 // 2014年 4月29日 Create by 风小锐 //==================================================== //想要实现一个五环图案,首先定义好五环的中心坐标、半径,在每个环中存有其中包含 //的所有粒子,使用循环依次画出其中的每个粒子。 var particleNum = window.innerWidth / 15; var offset=5; //每个粒子到圆心的偏移量 var color = ["blue","black","red","yellow","green"]; var RADIUS = window.innerWidth / 10; //圆的半径 var canvas; var ctx; var circles=[]; var SPEED_MIN = RADIUS/2; var SPEED_MAX = RADIUS; var fps=24; //动画运行的帧数 //入口函数 function init(){ canvas = document.getElementById('canvas'); canvas.width = window.innerWidth; canvas.height = window.innerHeight; ctx = canvas.getContext('2d'); initCircles(); //drawAll(); setInterval(drawAll,1000/fps); } //初始化所有环 function initCircles(){ var circle; for(var i = 1;i <= 3;i++){ circle = new Circle(i,1,RADIUS,color[i - 1]); initParticles(circle); circles.push(circle); } circle = new Circle(1,2,RADIUS,color[3]); initParticles(circle); circles.push(circle); circle = new Circle(2,2,RADIUS,color[4]); initParticles(circle); circles.push(circle); } //初始化一个环中的所有粒子 function initParticles(circle){ var ptc; var i; for(i=0;i<particleNum;i++){ ptc=new Particle(circle.centerX, circle.centerY, 2*Math.PI*i/particleNum, circle.radius, circle.color); circle.particles.push(ptc); } } //绘制所有的元素 function drawAll(){ var i; ctx.clearRect(0,0,window.innerWidth,window.innerHeight); for(i=0;i<5;i++) circles[i].draw(); } //定义环,包含圆心位置半径颜色信息 function Circle(cx,cy,r,_color){ if(cy == 1){ //上面三个环 this.centerX = r + 2 * r * (cx - 1) + ((window.innerWidth / 2) - 3 * r); this.centerY = r * cy + ((window.innerHeight / 2) - 1.5 * r); }else{ //下面两个环 this.centerX = r + 2 * r * (cx - 1) + r + ((window.innerWidth / 2) - 3 * r); this.centerY = r * cy + ((window.innerHeight / 2) - 1.5 * r); } this.radius = r; this.color = _color; this.particles=[]; //依次画出一个环中的所有粒子 this.draw= function(){ var i; for(i=0;i<particleNum;i++){ this.particles[i].draw(); this.particles[i].move(); } }; } //定义粒子,这里输入圆环的圆心和半径、颜色 function Particle(cx,cy,_angle,_radius,_color){ this.radius = getRandomNum(5,10); //粒子的半径 this.color=setColor(_color); //获取一个颜色,16进制rgb //旋转中心坐标 this.rotateCenterX = cx; this.rotateCenterY = cy; //角度 this.angle = _angle; //角速度,随机得到大小和方向 if(getRandomNum(1,10) % 2 == 0){ this.speed = Math.PI / (getRandomNum(SPEED_MIN,SPEED_MAX)); }else{ this.speed = - Math.PI / (getRandomNum(SPEED_MIN,SPEED_MAX)); } //到旋转中心的距离 this.distance=_radius+getRandomNum(-offset,offset); //圆心的坐标 this.centerX =this.rotateCenterX+this.distance*Math.cos(this.angle); this.centerY =this.rotateCenterY-this.distance*Math.sin(this.angle); //绘制粒子 this.draw =function(){ ctx.fillStyle=this.color; ctx.beginPath(); ctx.arc(this.centerX,this.centerY,this.radius,0,2*Math.PI,true); ctx.closePath(); ctx.fill(); }; //移动该粒子 this.move =function(){ this.angle += this.speed; //角度加上角速度 //根据新的角度计算粒子坐标 this.centerX =this.rotateCenterX+this.distance*Math.cos(this.angle); this.centerY =this.rotateCenterY+this.distance*Math.sin(this.angle); }; } // 取得随机数 function getRandomNum( min, max ) { return ( Math.random() * ( max - min ) + min ) | 0; } //根据选择的颜色随机选择一个rgb值并返回 function setColor(_color){ var fillStyle; switch(_color){ case "blue": switch((Math.random() * 5 | 0 ) % 5){ case 0: fillStyle="#0B5FA5"; break; case 1: fillStyle="#25547B"; break; case 2: fillStyle="#043C6B"; break; case 3: fillStyle="#3F8FD2"; break; case 4: fillStyle="#66A1D2"; break; default: break; } break; case "black": switch((Math.random() * 5 | 0 ) % 5){ case 0: fillStyle="#000"; break; case 1: fillStyle="#111"; break; case 2: fillStyle="#191919"; break; case 3: fillStyle="#2a2a2a"; break; case 4: fillStyle="#3b3b3b"; break; default: break; } break; case "red": switch((Math.random() * 5 | 0 ) % 5){ case 0: fillStyle="#FF0000"; break; case 1: fillStyle="#BF3030"; break; case 2: fillStyle="#A60000"; break; case 3: fillStyle="#FF4040"; break; case 4: fillStyle="#FF7373"; break; default: break; } break; case "yellow": switch((Math.random() * 5 | 0 ) % 5){ case 0: fillStyle="#FFF500"; break; case 1: fillStyle="#BFBA30"; break; case 2: fillStyle="#A69F00"; break; case 3: fillStyle="#FFF840"; break; case 4: fillStyle="#FFFA73"; break; default: break; } break; case "green": switch((Math.random() * 5 | 0 ) % 5){ case 0: fillStyle="#25D500"; break; case 1: fillStyle="#3DA028"; break; case 2: fillStyle="#188A00"; break; case 3: fillStyle="#59EA3A"; break; case 4: fillStyle="#80EA69"; break; default: break; } break; default: break; } return fillStyle; } </script> </head> <body onLoad="init();"> <canvas id="canvas" > Your browser doesn't support the HTML5 element canvas. </canvas> </body> </html>