1. 程式人生 > >結合canvas做雨滴特效

結合canvas做雨滴特效


雨滴特效


<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>匯制雨滴</title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            canvas{
                display: block;
                /*vertical-align: middle;*/
                background: #000;
            }
        </style>
    </head>
    <body>
        <canvas id="canvas">您的瀏覽器不支援畫布,請您更換瀏覽器</canvas>
    </body>
    <script type="text/javascript">
        var can = document.getElementById('canvas');
        //設定2d繪圖
        var ctx = can.getContext('2d')
        
        //獲取瀏覽器視窗的寬高
        var w = can.width = window.innerWidth;
        var h = can.height = window.innerHeight;
        
        //自適應瀏覽器寬高
         window.onresize = function(){
            w = can.width = window.innerWidth;
            h = can.height = window.innerHeight;
         }
         
         //canvas繪製矩形
         //設定矩形框的路徑
            //ctx.rect(x,y,w,h); //xy 座標  wh寬高
         //畫出來
            //ctx.fill();  //填充方法
            //stx.stroke(); //觸筆方法 空心的
//          ctx.fillStyle = 'red';
//          ctx.fillRect(100,100,100,100)
//          //繪製圓形
//          ctx.arc(250,250,50,0,Math.PI*2,false)
//          ctx.strokeStyle = 'red';
//          ctx.stroke();
            
         //運動
//       var y = 0;
//          setInterval(function(){
//              y++;
//              //先清空再繪製
//              ctx.clearRect(0,0,w,h);
//              ctx.fillRect(100,y,100,100)
//          },30)
        //雨滴特效
        function Drop(){ //建立雨滴類
            
        }
        //原型
        Drop.prototype ={
            //初始化
            init:function(){
                this.x = rand(0,w);//雨滴的初始X座標
                this.y = 0;//雨滴的初始Y座標
                this.vy = rand(4,5) //雨滴下落的速度
                this.l = rand(0.8*h,0.9*h);//雨滴下落的最大高度
                this.r = 1;//初始半徑
                this.vr = 1; //半徑增大的速度
                this.a = 1; //初始透明度
                this.va = 0.9; //透明度變化係數
            },
            //繪製
            draw:function(){
                if (this.y>this.l) {
                    ctx.beginPath() //開始路徑
                    //繪製波紋(圓形)
                    ctx.arc(this.x,this.y,this.r,0,Math.PI*2,false)
                    ctx.strokeStyle = 'rgba(0,255,255,'+ this.a + ')';
                    ctx.stroke();
                }else{
                    //繪製下落的雨滴
                    //ctx.clearRect(0,0,w,h);
                    ctx.fillStyle = 'rgba(0,255,255,1)'
                    ctx.fillRect(this.x,this.y,2,10);
                }
                
                this.update();
            },
            //更新座標
            update:function(){
                //當y座標小於1高度的時候就一直累加
                if (this.y<this.l) {
                    this.y += this.vy;
                }else{
                    //圓形半徑增大
//                  if (this.r<50) {
//                      this.r += this.vr;
//                  }else{
//                      
//                  }
                    //判斷透明度
                    if (this.a>0.03) {
                        this.r += this.vr;
                        if (this.r > 50) {
                            this.a *= this.va;
                        }
                    }else{
                        //重新初始化了
                        this.init()
                    }
                    
                }
//              this.y += this.vy;
            }
        }
        //例項化雨滴物件
//      var drop = new Drop();
//      drop.init();
        
        var drops = [];
        for (var i=0; i<30; i++) {
            setTimeout(function(){
                var drop = new Drop();
                drop.init();
                drops.push(drop);
            },i*200)
            
        }
        
        setInterval(function(){
            //繪製一個透明層
            ctx.fillStyle = 'rgba(0,0,0,0.1)';
            ctx.fillRect(0,0,w,h)
            for (var i=0; i<drops.length; i++) {
                drops[i].draw()
            }
//          drop.draw()
        },1000/60); //幀數
        
        function rand(min,max){
            return Math.random()*(max-min) +min;//min~MAX
        }
    </script>
</html>