粒子动画-躁动的小球代码全

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>

    </style>
</head>
<body>
    <canvas id="canvas"></canvas>
</body>
<script>
   //获取到canvas
   var canvas = document.querySelector('#canvas');
   //设置上下文对象
   var ctx = canvas.getContext('2d');
   //设置画布的宽 高
   var w = canvas.width = window.innerWidth;
   var h = canvas.height = window.innerHeight;
   //封装一个随机数函数
   function randomFn(min,max){
       return parseInt(Math.random()*(max-min) + min);
   }
   //创建关于小球的构造函数,x:x轴中心坐标点;y:y轴中心坐标点;size:小球半径;speedx:小球在x轴方向上的速度,speedy: 小球在y轴方向上的速度,
   //color: 小球颜色
   function Ball(x,y,size,speedx,speedy,color){
       this.x = x;
       this.y = y;
       this.size = size;
       this.speedX = speedx;
       this.speedY = speedy;
       this.color = color;
   }
   //绘制小球
   Ball.prototype.draw = function () {
        ctx.beginPath();
        ctx.fillStyle = this.color;
        ctx.arc(this.x,this.y,this.size,0,Math.PI*2);
        ctx.fill();
   }
   //躁动的小球,核心思想不断改变小球的坐标,如果小球到达边界,则将速度设置为相反数,形成了反弹效果
   Ball.prototype.run = function(){
       //当小球处于快超过x轴边界时,取相反速度,就有了反弹效果
       if(this.x + this.size >= w){
           this.speedX = - this.speedX;
       }
       //当小球处于快超过y轴边界时,取相反速度,就有了反弹效果
       if(this.y + this.size >= h){
           this.speedY = - this.speedY;
       }
       if(this.x - this.size <= 0){
           this.speedX = -this.speedX;
       }
       if(this.y - this.size <= 0){
           this.speedY = -this.speedY;
       }
       //当小球的速度恰好随机为0时,小球是静止在页面上的,从体验角度上来说不太美观,所以当在x轴的速度与在y轴的速度同时为0时,重新定义速度
       if(this.speedX == 0 && this.speedY == 0){
           this.speeX = randomFn(-7,7);
           this.speedY = randomFn(-7,7);
       }


       this.x += this.speedX;
       this.y += this.speedY;
   }

   //当两个小球相撞或有重叠时,改变颜色
   Ball.prototype.xiangzzhuang = function(){
       for(var i = 0 ; i < balls.length; i++){
           if(!(this === balls[i])){
               //此处运用到了勾股定理
               var dx = this.x - balls[i].x;
               var dy = this.y - balls[i].y;
               var distance = Math.sqrt(dx*dx+dy*dy);
               if(distance < this.size + balls[i].size){
                   balls[i].color = this.color = 'rgb('+ randomFn(0,255) +',' + randomFn(0,255) + ',' + randomFn(0,255)  + ')';
               }
           }
       }
   }
   var balls = [];
   function loop(){
       //绘制画布的背景颜色
       ctx.fillStyle = 'rgba(0,0,0,0.3)';
       ctx.fillRect(0,0,w,h);
       //创建30个小球
        while(balls.length < 30){
            var ball = new Ball(
                randomFn(0,w),
                randomFn(0,h),
                randomFn(10,20),
                randomFn(-7,7),
                randomFn(-7,7),
                'rgb('+ randomFn(0,255) +',' + randomFn(0,255) + ',' + randomFn(0,255)  + ')'
            )
            balls.push(ball);
        }

        for(var i = 0; i < balls.length; i++){
            balls[i].draw();
            balls[i].run();
            balls[i].xiangzzhuang();
        }
        //window提供的API动画,以电脑屏幕刷新频率为基准(16.6ms就刷新一次,人类肉眼根本觉察不到),所以不会造成动画卡顿的现象
       window.requestAnimationFrame(loop);
   }
   loop();
</script>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值