canvas-小球回弹连线

<style>
    *{margin: 0;padding: 0;}
    canvas{ display: block;margin: 10px auto;border: 1px solid #333;}
</style>
<body>
    <canvas id="mycanvas"></canvas>    
    <script>
        var canvas = document.getElementById("mycanvas");
        //上下文
        var ctx = canvas.getContext("2d");
        //console.log(ctx)
        canvas.width = document.documentElement.clientWidth - 30;
        canvas.height = document.documentElement.clientHeight - 30;
        //console.log( canvas.width, canvas.height)
        //小球类
        function Ball(){
            //半径
            this.r = 10;
            //圆心
            do{
                this.x = parseInt(Math.random() * canvas.width);
                this.y = parseInt(Math.random() * canvas.height);
            }while(this.x < this.r || this.x > canvas.width - this.r || this.y< this.r || this.y > canvas.height - this.r)
           
            //速度 -5到4 不同方向移动不能为0
            do{
                this.dx = parseInt(Math.random() * 10) - 5;
                this.dy = parseInt(Math.random() * 10) - 5;
            }while(this.dx ==0 && this.dy ==0)
            //小球颜色
            this.color = "gray";
            //维护小球的数组
            ballArr.push(this);
            //记录小球在数组中的位置 避免互相连线
            this.index = ballArr.length-1;
        }
        //渲染小球
        Ball.prototype.render = function(){
            //console.log(this.index);
            //画圆
            ctx.beginPath();
            //透明度
            ctx.globalAlpha = 1;
            ctx.arc(this.x,this.y,this.r,0,Math.PI * 2,false);
            ctx.fillStyle= this.color;
            ctx.fill();
            for(var i=this.index;i<ballArr.length;i++){
                if(Math.abs(ballArr[i].x - this.x) < 150 && Math.abs(ballArr[i].y - this.y) < 150){
                    ctx.beginPath();
                    // 线的透明度,根据当前的两个已经连线的小球的距离进行线的透明度设置
                    //Math.pow()返回 x 的 y 次幂的值。
                    //Math.sqrt函数返回一个数的平方根
                    ctx.globalAlpha = 10 / Math.sqrt(Math.pow(ballArr[i].x - this.x, 2) + Math.pow(ballArr[i].y - this.y, 2))
                    ctx.moveTo(this.x,this.y);
                    ctx.lineTo(ballArr[i].x,ballArr[i].y);
                    ctx.strokeStyle = "#000";
                    ctx.closePath();
                    ctx.stroke();
                }
            }
        }
        //小球运动
        Ball.prototype.update = function(){
            //console.log(ballArr)
            this.x += this.dx;
            this.y += this.dy;
            //如果超出画布,向相反的方向移动
            if(this.x < this.r || this.x > canvas.width-this.r){
                this.dx = -this.dx;
            }
            if(this.y < this.r || this.y > canvas.height - this.r){
                this.dy = -this.dy;
            }
        }
        //将小球维护到数组中
        var ballArr = [];
        //创建小球
        for(var i=0;i<50;i++){
            new Ball();
        }
        //定时器渲染更新小球
        setInterval(() => {
            //清除画布
            ctx.clearRect(0,0,canvas.width,canvas.height);
            for(var i=0;i<ballArr.length;i++){
                ballArr[i].render();
                ballArr[i].update();
            }
        }, 20);
    </script>
</body>
</html>

 

canvas 中文文档

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值