其他分享
首页 > 其他分享> > canvas学习笔记【2021.10.29】

canvas学习笔记【2021.10.29】

作者:互联网

今天跟着B站up主老板汽水加糖,学习了用canvas线性小球。

split()方法 按值分割字符串为数组的方法,如果有多个值,可以把它看成数组中的逗号。

例子:

let textArry = 'javaScript HTML PHP Canvas CSS ES6 vue React NodeJs'.split(' ');

console.log(textArry);

结果如下:

Array(9) [ "javaScript", "HTML", "PHP", "Canvas", "CSS", "ES6", "vue", "React", "NodeJs" ]

fillStyle继承问题 当你前面设置了fillStyle的时候,使用closepath()是不会清除fillStyle的,就像用画笔粘了颜色,你清除画布是没用的,因为没有改变画笔粘的颜色。利用这个继承机制,我们可以让小球的颜色和线的颜色一致。

连线问题 这个就是有x个小球,想让每一个小球都连接在一起,那么需要从第一个小球从0开始依次递增。比如5个球,第一个连接0个,第二个连接1个。。。第五个连接4个。

完整代码如下:

!
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body{
            width: 98vw;
            height: 98vh;
        }
    </style>
</head>

<body>
    <canvas id="canvas">
        您的浏览器不支持canvas,请升级。
    </canvas>
</body>
<script>
    /** @type {HTMLCanvasElement} */
    var canvas = document.querySelector("#canvas");
    var ctx = canvas.getContext('2d');

    let w = document.documentElement.clientWidth-6;
    let h = document.documentElement.clientHeight-6;
    canvas.width=w;
    canvas.height=h;

    //第一步封装三个函数
    //画线
    function drawLine(x1, y1, x2, y2, color) {
        ctx.beginPath();
        ctx.moveTo(x1, y1);
        ctx.lineTo(x2, y2);
        ctx.strokeStyle = color || '#000';
        ctx.stroke();
        ctx.closePath();
    }
    //画字
    function drawText(text, x, y) {
        ctx.font = "28px 楷体";
        //fillStyle不会因为关闭路径而消失
        ctx.textAlign = "start";
        ctx.textBaseline = "middle";
        ctx.fillText(text, x, y);
    }
    //画球
    function drawBall(x, y, r, color) {
        ctx.beginPath();
        ctx.arc(x, y, r, 0, Math.PI * 2);
        ctx.fillStyle = color || '#000';
        ctx.fill();
        ctx.closePath();
    }
    //创建小球类
    function random(num) {
        return parseInt(Math.random() * num);//随机整数
    }
    function ball(text) {
        //随机生成的属性
        this.x = random(1096)+52;
        this.y = random(696)+52;
        this.r = random(40) + 50;
        this.color = "#" + parseInt(Math.random() * 0xffffff).toString(16);
        this.xSpeed = random(8 - 3) + 3;
        this.ySpeed = random(7 - 2) + 2;
        //外部传入的参数
        this.text=text;
    }
    //显示小球
    ball.prototype.show = function(){
        this.run();
        drawBall(this.x, this.y, this.r, this.color);
        drawText(this.text,this.x+this.r+5,this.y);//字的颜色和球颜色一样,是因为canvas保存了上一个的fillstyle
        
    }
    //碰撞检测
    ball.prototype.run = function(){
        if(this.x-this.r<=0||this.x+this.r>=w){
            this.xSpeed=-this.xSpeed;//this少不了
        }
        this.x=this.x + this.xSpeed;
        if(this.y-this.r<=0||this.y+this.r>=h){
            this.ySpeed=-this.ySpeed;
        }
        this.y=this.y+this.ySpeed;
    }
    //建立放文字的数组
    let textArry = 'javaScript HTML PHP Canvas CSS ES6 vue React NodeJs'.split(' ');
    console.log(textArry);
    //建立小球数组
    let ballArry =[];
    //创建5个小球并放在数组中
     for(var i =0;i<5;i++){
        var Ball = new  ball(textArry[i]);//记得用new创建新对象;传入text;数组还得放前面
        ballArry.push(Ball);
        Ball.show();
     }
     //更新坐标,让小球动起来
     let ballTimer = setInterval(function(){
       ctx.clearRect(0,0,w,h);
      for(var i =0;i<5;i++){
          ballArry[i].show();
      //两次for循环实现小球连线
        //原理:小球连接的个数为自身顺序-1,这可通过j来确定连接的个数
        for(var j =0;j<i;j++){
            //取出ballArry[i]前面的小球
            var frontBall = ballArry[j];
            drawLine(ballArry[i].x,ballArry[i].y,frontBall.x,frontBall.y,ballArry[i].color);
        }
    }
     },20)

    
</script>

</html>

标签:function,canvas,2021.10,小球,random,ctx,29,text
来源: https://blog.csdn.net/masierty/article/details/121044187