附之前链接:用canvas绘制漫天飞舞的雪花1
用canvas绘制漫天飞舞的雪花3
接上一篇 :
效果链接:https://codepen.io/andy-js/pen/QWwavJj
右键打开效果更好。
这次将上篇的JS装成方法,并在此基本上填加了一个初始角度的设置。
以方法随时调用。
直接上代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>andy-js:用canvas绘制漫天飞舞的雪花2</title>
<style>
*{margin:0;padding:0}
</style>
</head>
<body>
<script>
class Snowflake{
constructor(ctx){
this.ctx=ctx;
};
render({width,x,y,angle}){
this.width=width; //雪花外框大小
this.x=x;
this.y=y;
this.angle=angle;
this.ctx.save();
this.init();
this.bole();
this.ctx.restore();
};
init(){ //初始化
this.lineWidth=parseInt(this.width/60); //主干线的宽度
this.lineHeight=this.width/2*0.8; //主干线的 长度
if(this.lineHeight<1)this.lineHeight=1;
this.heightArr=[ this.lineHeight*0.12,this.lineHeight*0.12,this.lineHeight*.2,this.lineHeight*0.3 ];
this.ctx.lineWidth=this.lineWidth;
this.ctx.strokeStyle='#fff';
this.ctx.fillStyle="#fff";
this.ctx.translate(this.x,this.y);//重新映射画布上的 (0,0) 位置 映射到雪花位置
//旋转 起始度
if(this.angle!=0)this.ctx.rotate( this.angle*Math.PI/180 );
};
bole(){
for(let i=0;i<6;i++){
this.ctx.lineCap="round";//向线条的每个末端添加圆形线帽。
this.ctx.fillStyle="#fff";
this.ctx.beginPath();
this.ctx.moveTo(0,0);
this.ctx.lineTo(0,-this.lineHeight);
this.ctx.stroke();
//画顶端圆
this.ctx.beginPath();
this.ctx.arc(0,-this.lineHeight,this.lineWidth*1.5,0,Math.PI*2,true);
this.ctx.fill();
//画支线
this.branch();
//旋转
this.ctx.rotate(Math.PI/3);
};
};
branch(){ //画分支
let lineHeight=this.lineHeight;
let start=0,
gap=parseInt(lineHeight /4); //每根分支的间距
for(let i=0;i<4;i++){
this.ctx.lineCap="round";//向线条的每个末端添加圆形线帽。
let spot=this.getXY(45,this.heightArr[i]);
this.ctx.beginPath();
this.ctx.moveTo(0,start);
this.ctx.lineTo(spot.x, start+spot.y );
this.ctx.stroke();
this.ctx.beginPath();
this.ctx.moveTo(0,start);
this.ctx.lineTo(-(spot.x), start+spot.y );
this.ctx.stroke();
start-=gap;
};
};
getXY(angle,radius){ //通过正余弦区取XY坐标
return {
x:Math.sin((180-angle)*Math.PI/180)*radius,
y:Math.cos((180-angle)*Math.PI/180)*radius
}
};
background(w,h){
this.ctx.fillStyle="#000";
this.ctx.fillRect(0,0,w,h);
};
};
var oC1=document.createElement('canvas');
ctx = oC1.getContext("2d");
var w=document.documentElement.clientWidth,h=800
oC1.setAttribute('width',w);
oC1.setAttribute('height',h);
document.body.appendChild(oC1);
var renderSnow=new Snowflake(ctx);
renderSnow.background(w,h); //背景刷黑
//默认画面
var startX=50,width=30,snows=[];
while(startX<w){
let o={
ctx:ctx,
width:width,
x:startX,
y:h/2,
angle:rnd(0,360)
};
snows.push(o);
renderSnow.render(o);
startX+=width;
width+=10;
};
//先简单开个定时器
setInterval(function(){
renderSnow.background(w,h);
snows.forEach(function(o){
o.angle+=15;
if(o.angle>360)o.angle=o.angle%360;
renderSnow.render(o);
});
},100);
function rnd(n,m){
return Math.random()*(m-n+1)+n;
};
</script>
</body>
</html>
在下一篇中将绘制出漫天飞舞
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。