zoukankan      html  css  js  c++  java
  • 彩色小球的重现以及下雪效果的实现

    之前我看到一篇文章是介绍彩色小球的实现;

    链接:http://www.cnblogs.com/xiaohuochai/p/6370123.html

    我按照他的思路也写了一个:

    代码:

    var canvas = document.getElementById('canvas');
        var H = 300,W = 500;
        canvas.height = H;
        canvas.width = W;
    
        var Num = 30;
        //小球个数
    
        btn.onclick = function(){history.go();}
    
        var balls = [];
    
        function getBalls(){
            var cxt = canvas.getContext('2d');
            for (var i = 0; i < Num; i++) {
                var tempR = (Math.random()*255)|0;
                var tempG = (Math.random()*255)|0;
                var tempB = (Math.random()*255)|0;
    
                var tempColor = 'rgb(' +tempR+','+tempG +','+tempB+')';
                //填充物体的颜色
                //随机的小球颜色
                
                var posiR = (Math.random()*30+20)|0;//半径?
                var posiX = (Math.random()*(W-posiR))|0;
                var posiY = (Math.random()*(H-posiR))|0;
                //圆的横纵坐标和半径
                
    
                var tempBall = {
                    x:posiX,
                    y:posiY,
                    r:posiR,
                    stepX:(Math.random()*13-6)|0,// 运动方向
                    stepY:(Math.random()*13-6)|0,//?
                    color:tempColor
                }
    
                balls[balls.length] = tempBall;
    
    
                // cxt.beginPath();
                // //在绘制图形前调用,即创建一个新路径
    
                // cxt.arc(posiW,posiH,posiR,0,Math.PI*2);
                // //创建弧形(圆) parm:x坐标 y 坐标 半径 起始角 结束角
                
                // cxt.fill();
                // //填充当前的路径(图像)
    
            }
        }
        var bumpTest = function(ele){
             //左侧
            if(ele.x <= ele.r){
                ele.x = ele.r;
                ele.stepX = -ele.stepX;
            }
            //右侧
            if(ele.x >= W - ele.r){
                ele.x = W - ele.r;
                ele.stepX = -ele.stepX;
            }
            //上侧
            if(ele.y <= ele.r){
                ele.y = ele.r;
                ele.stepY = -ele.stepY;
            }
            //下侧
            if(ele.y >= H - ele.r){
                ele.y = H - ele.r;
                ele.stepY = -ele.stepY;
            }
        }
    
        var updateBalls = function (){
            var i = balls.length;
            while(i--){
                balls[i].x += balls[i].stepX;
                balls[i].y += balls[i].stepY; 
                bumpTest(balls[i]); 
            }
        }
    
        var renderBalls = function (){
            canvas.height = H;
            //重置画布高度,可以清空画布
            //
            
            var cxt = canvas.getContext('2d');
            var i = balls.length;
    
            while(i--){
    
                cxt.beginPath();
    
                cxt.arc(balls[i].x,balls[i].y,balls[i].r,0,2*Math.PI);
    
                cxt.fillStyle = balls[i].color;
    
                 cxt.globalCompositeOperation = 'lighter';
    
                cxt.closePath();//?
                //创建从当前点到起始点的路径
    
                cxt.fill();
            }
        }
    
        getBalls();//创建各个小球的初始状态;
    
        // renderBalls();
        clearInterval(oTimer);
    
        var oTimer = setInterval(function(){
            updateBalls();
    
            renderBalls();
        },50)

    demo:

    http://en.jsrun.net/ryiKp/show

    而后我又想起了以前想做的下雪的效果;

    于是我便做了这个效果:

    一次下雪的效果实现:

        var winWidth,winHeight;
    
        var speed = 5;//雪花下降速度
    
        var Num = 10;//雪花数量
    
    
        function getWindowSize(){
            //获取窗口宽度
            if(window.innerWidth){    //兼容火狐,谷歌,safari等浏览器
                winWidth=window.innerWidth;
            }else if((document.body)&&(document.body.clientWidth)){    //兼容IE浏览器
                winWidth=document.body.clientWidth;
                }
            
            //获取窗口高度
            if(window.innerHeight){
                winHeight=window.innerHeight;
            }else if((document.body)&&(document.body.clientHeight)){
                winHeight=document.body.clientHeight;
                }
            }
        getWindowSize();
    
    
        var main = document.getElementById('snow');
    
    
        main.style.width = winWidth + 'px';
        main.style.height = winHeight + 'px'
    
        document.body.style.margin = 0;
    
    
        main.style.backgroundColor = '#79c6e8';
    
        
        var arr = [];
    
        var render = function(){
            
            while(Num--){
    
                var RS = {
                    x:(Math.random()*winWidth)|0,
                    y:0,
                    stepX:(Math.random()*5-2)|0,
                    stepY:((Math.random()*speed)|0)+5
                }
    
                var img = document.createElement('div');
                 img.style.width = '20px';
                 img.style.height = '20px';
                 img.style.background = 'url(https://files.cnblogs.com/files/Grewer/snow.gif) no-repeat -9px -3px';
                 img.style.backgroundSize = '36px 27px';
    
                 img.style.position = 'absolute';
    
                 img.style.left = RS.x + 'px';
                 img.style.top = (RS.y-20)+'px';
                 main.appendChild(img);
    
                 RS.el = img;
    
    
                 arr[arr.length] = RS;
    
            }
    
             console.log(arr)
        }
    
        render();
    
    
        var removeElement = function (_element){
             var _parentElement = _element.parentNode;
             if(_parentElement){
                    _parentElement.removeChild(_element);
             }
        }
    
        var check = function(list){
            if(list.x-20 <= 0){
                removeElement(list.el)
                return true
            }
    
            if(list.x+20 >= winWidth){
                removeElement(list.el)
                return true
            }
    
            if(list.y+20 > winHeight){
                removeElement(list.el)
                return true;
            }
    
            return false;
        }
    
    
    
         var update = function(){
             var i = arr.length;
             while(i--){
                 var list = arr[i],
                 obj = list.el;
    
                 list.x += list.stepX;
                 obj.style.left = list.x + 'px';
    
                 list.y += list.stepY;
                 obj.style.top = list.y + 'px';
    
                 if(check(list)){
                     arr.splice(i,1);
                 }
             }
             console.log(arr.length)
             if(arr.length === 0){
                 console.log(1)
                 return false;
             }
        }
    
         var q = setInterval(function(){
             if(update() === false){
                 console.log(123)
                 clearInterval(q);
             }
         },100)

     经过整理后的连续下雪的效果:

    -(function(){
    
        var Grewer = {
            init:function(option){
                option = option || {};
    
                this.speed = option.speed || 5;//雪花下降速度
    
                //获取窗口宽度    
                this.getWindowSize();
    
    
                this.main = document.getElementById('snow');
    
    
                this.main.style.width = this.winWidth + 'px';
                this.main.style.height = this.winHeight + 'px'
    
                document.body.style.margin = 0;
    
    
                this.main.style.backgroundColor = '#79c6e8';
                //背景色
    
                this.arr = [];
    
                this.run(option);
            },
            getWindowSize:function(){
                if(window.innerWidth){  
                    this.winWidth=window.innerWidth;
                }else if((document.body)&&(document.body.clientWidth)){   
                    this.winWidth=document.body.clientWidth;
                }
    
                    if(window.innerHeight){
                        this.winHeight=window.innerHeight;
                    }else if((document.body)&&(document.body.clientHeight)){
                        this.winHeight=document.body.clientHeight;
                    }
                    
                },
                render:function(num){
                    this.Num = (num * Math.random())|0;
                    //雪花数
                    while(this.Num--){
                        var RS = {
                            x:(Math.random()*this.winWidth)|0,
                            y:0,
                            stepX:(Math.random()*5-2)|0,
                            stepY:((Math.random()*this.speed)|0)+this.speed
                        }
    
                        var img = document.createElement('div');
                        img.style.width = '20px';
                        img.style.height = '20px';
    
                        img.style.background = 'url(https://files.cnblogs.com/files/Grewer/snow.gif) no-repeat -9px -3px';
                        img.style.backgroundSize = '36px 27px';
    
                        // img.innerHTML = '*';
                        // img.style.color = '#fff';
    
                        img.style.position = 'absolute';
    
                        img.style.left = RS.x + 'px';
                        img.style.top = (RS.y-20)+'px';
                        this.main.appendChild(img);
    
                        RS.el = img;
    
    
                        this.arr.push(RS);
    
                    }
                },
                update:function(){
                    var i = this.arr.length;
                    while(i--){
                        var list = this.arr[i],
                        obj = list.el;
    
                        list.x += list.stepX;
                        obj.style.left = list.x + 'px';
    
                        list.y += list.stepY;
                        obj.style.top = list.y + 'px';
    
                        if(this.check(list)){
                            this.arr.splice(i,1);
                        }
                    }
                    
                },
                removeElement:function (_element){
                    var _parentElement = _element.parentNode;
                    if(_parentElement){
                        _parentElement.removeChild(_element);
                    }
                },
                check:function(list){
                    if(list.x-20 <= 0){
                        this.removeElement(list.el)
                        return true
                    }
    
                    if(list.x+20 >= this.winWidth){
                        this.removeElement(list.el)
                        return true
                    }
    
                    if(list.y+20 > this.winHeight){
                        this.removeElement(list.el)
                        return true;
                    }
    
                    return false;
                },
                run:function(option){
                    setInterval(function(){
                        snow.update();
                    }
                    ,100);
                    setInterval(function(){
                        snow.render(option.num||10)
                    },option.snowFlash||1000)
                }
    
            }
    
    
            window.snow = Object.create(Grewer);
    
    })()
            // obj.init({
            //     'speed':5,
            //     'num':10,
            //     'snowFlash':1000
            // });//加入参数
    
            
        snow.init();

    demo:

    http://en.jsrun.net/myiKp/show

    如有不妥之处还请指出

  • 相关阅读:
    组合数据类型练习,英文词频统计实例
    条件、循环、函数定义等练习
    大数据应用实例
    实验二-模拟在CPU中的优先级调度
    实验二——模拟在CPU中的进程调度(改稿)
    实验二——模拟在CPU中的进程调度(初稿)
    回答前文问题
    13.14.15.16.17&《一个程序猿的生命周期》读后感
    10,11,12读书有感
    读书三章8,9,10
  • 原文地址:https://www.cnblogs.com/Grewer/p/7602233.html
Copyright © 2011-2022 走看看