附之前链接:用canvas绘制漫天飞舞的雪花1
用canvas绘制漫天飞舞的雪花3

111.gif

接上一篇 :
效果链接: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>

在下一篇中将绘制出漫天飞舞


andy
6 声望3 粉丝

贪财好色!经不住诱惑!