canvas统计图,碰撞检测

264 阅读1分钟

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战

1, 统计图制作

统计图在实际的项目开发过程中经常会用到,比如下面的案例图:

1643300818084.png

<!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>圆形统计图</title>
  <style>
    canvas {
      margin: 0 auto;
      border: 1px solid red;
      display: block;
    }
  </style>
</head>
<body>
  <canvas id="canvas" width="500px" height="500px">
    您的浏览器不支持Canvas, 建议你使用Chrome或者火狐浏览器达到更好的显示效果
  </canvas>
</body>
<script>
  // 获取canvas标签
  var canvas = document.getElementById('canvas')
  // 获取canvas上下文对象,可理解为:使用画布的权限
  var context = canvas.getContext('2d')
  var w = context.canvas.width;
  var h = context.canvas.height;
  context.font = "50px Microsoft YaHei";
  context.textAlign = "center"; //水平对齐方式
  context.textBaseline = "middle"; //垂直对齐方式
  context.fillText('97%', w / 2, h / 2, 30)
  var deg = Math.PI * 2 / 360;
  var count = 1
  var timer = setInterval(function() {
    count++;
    context.beginPath();
    // context.arc(250, 250, 200, 0, count * deg, false);
    context.arc(250, 250, 200, -Math.PI/2, count * deg - Math.PI / 2, false);
    context.lineWidth = 5;
    context.strokeStyle = '#f00';
    context.stroke(); 
    if (count === 270) {
      clearInterval(timer)
    }
  })
</script>
</html>

效果图如下:

统计图.gif

2, 小球碰撞检测

小球碰撞检测主要在游戏开发中比较场景

<!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>碰撞检测</title>
  <style>
    canvas {
      margin: 0 auto;
      border: 1px solid red;
      display: block;
    }
  </style>
</head>
<body>
  <canvas id="canvas" width="500px" height="500px">
    您的浏览器不支持Canvas, 建议你使用Chrome或者火狐浏览器达到更好的显示效果
  </canvas>
</body>
<script>
  // 获取canvas标签
  const canvas = document.getElementById('canvas')
  // 获取canvas上下文对象,可理解为:使用画布的权限
  const context = canvas.getContext('2d')
  let w = context.canvas.width;
  let h = context.canvas.height;
  // 画一个小球
  let x = 100;
  let y = 100;
  let r = 20;
  // 水平速度
  let xSpeed = 2;
  // 垂直速度
  let ySpeed = 3;

  setInterval(function() {
    context.clearRect(0, 0, w, h)
    // 在小球碰到边缘的时候,速度取反即可
    if (x -r <=0 || x + r >= w) {
        xSpeed = -xSpeed;
    }
    x = x + xSpeed; // 水平运动

    if (y -r <=0 || y + r >= h) {
      ySpeed = -ySpeed
    }
    y = y + ySpeed

    drawCircle(x, y, r)
  }, 10)

  // 封装小球
  function drawCircle(x, y, r) {
    context.beginPath();
    context.arc(x, y, r, 0 , Math.PI * 2)
    context.fillStyle = 'gold'
    context.fill()
    context.stroke()
  }
</script>
</html>

效果如图:

小球碰撞.gif

3, 面向对象小球

首先通过对象构建一个小球,并在其原型上添加两个方法,一个用来显示的show(),一个用来运动的run(),

详细代码如下:

<!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>面向对象小球</title>
  <style>
    canvas {
      margin: 0 auto;
      border: 1px solid red;
      display: block;
    }
  </style>
</head>
<body>
  <canvas id="canvas" width="500px" height="500px">
    您的浏览器不支持Canvas, 建议你使用Chrome或者火狐浏览器达到更好的显示效果
  </canvas>
</body>
<script>
  // 获取canvas标签
  const canvas = document.getElementById('canvas')
  // 获取canvas上下文对象,可理解为:使用画布的权限
  const context = canvas.getContext('2d')
  let w = context.canvas.width;
  let h = context.canvas.height;
  
  // 面向对象
  function Ball(x, y, r, color, xSpeed, ySpeed) {
    function r(num) {
      return Math.random() * num;
    }
    this.x = r(5) + 60
    this.y = r(3) + 60
    this.r = r(50) + 10 // [10-60]
    this.color = '#' + parseInt(Math.random() * 0xFFFFFF).toString(16);
    this.xSpeed = r(3) + 2;
    this.ySpeed = r(3) + 1
  }
  // 定义小球显示方法
  Ball.prototype.show = function() {
    // 更新坐标,显示小球
    this.run()
    context.beginPath();
    context.arc(this.x, this.y, this.r, 0 , Math.PI * 2)
    context.fillStyle = this.color;
    context.fill()
  }
  // 定义小球运动方法
  Ball.prototype.run = function() {
    if (this.x - this.r <=0 || this.x + this.r >= w) {
      this.xSpeed = -this.xSpeed;
    }
    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
  }
  var ballArr = [];
  for(var i = 0; i< 20; i++) {
    const ball = new Ball()
          ballArr.push(ball)
          ball.show()
  }
  setInterval(function() {
    context.clearRect(0, 0, w, h)
    for(var i = 0; i< ballArr.length; i++) {
      var ball = ballArr[i];
      ball.show()
    }
  }, 20)
  // 封装小球
</script>
</html>

效果如图:

面向对象.gif

4, 项目源码

项目代码地址和文档中的截图都是同步的,都已经实现, 在canvas文件夹中

[持续更新中]

gitee.com/jamiedawn/t…