VueBloghyhero6

canvas 初见,

2019-09-24 / 2019-09-24 / 307次浏览

关于canvas,嗯,去MDN 看了一眼真全啊。

https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes

有兴趣玩玩,
它画了一个吃豆人的例子很有意思:

直接撸代码吧:

    draw () {
    const canvas = this.canvas.current
    if (canvas.getContext) {
      const ctx = canvas.getContext('2d')
      this.roundedRect(ctx, 12, 12, 150, 150, 15)
      this.roundedRect(ctx, 19, 19, 150, 150, 9)
      this.roundedRect(ctx, 53, 53, 49, 33, 10)
      this.roundedRect(ctx, 53, 119, 49, 16, 6)
      this.roundedRect(ctx, 135, 53, 49, 33, 10)
      this.roundedRect(ctx, 135, 119, 25, 49, 10)
      ctx.beginPath()
      ctx.arc(37, 37, 13, Math.PI / 7, -Math.PI / 7, false)
      ctx.lineTo(38, 37)
      ctx.fill()
      for (var i = 0; i < 8; i++) {
        ctx.fillRect(51 + i * 16, 35, 4, 4)
      }
      for (i = 0; i < 6; i++) {
        ctx.fillRect(115, 51 + i * 16, 4, 4)
      }
      for (i = 0; i < 8; i++) {
        ctx.fillRect(51 + i * 16, 99, 4, 4)
      }

      ctx.beginPath()
      ctx.moveTo(83, 116)
      ctx.lineTo(83, 102)
      ctx.bezierCurveTo(83, 94, 89, 88, 97, 88)
      ctx.bezierCurveTo(105, 88, 111, 94, 111, 102)
      ctx.lineTo(111, 116)
      ctx.lineTo(106.333, 111.333)
      ctx.lineTo(101.666, 116)
      ctx.lineTo(97, 111.333)
      ctx.lineTo(92.333, 116)
      ctx.lineTo(87.666, 111.333)
      ctx.lineTo(83, 116)
      ctx.fill()

      ctx.fillStyle = '#fff'
      ctx.beginPath()
      ctx.moveTo(91, 96)
      ctx.bezierCurveTo(88, 96, 87, 99, 87, 101)
      ctx.bezierCurveTo(87, 103, 88, 106, 91, 106)
      ctx.bezierCurveTo(94, 106, 95, 103, 95, 101)
      ctx.bezierCurveTo(95, 99, 94, 96, 91, 96)
      ctx.moveTo(103, 96)
      ctx.bezierCurveTo(100, 96, 99, 99, 99, 101)
      ctx.bezierCurveTo(99, 103, 100, 106, 103, 106)
      ctx.bezierCurveTo(106, 106, 107, 103, 107, 101)
      ctx.bezierCurveTo(107, 99, 106, 96, 103, 96)
      ctx.fill()

      ctx.fillStyle = 'black'
      ctx.beginPath()
      ctx.arc(101, 102, 2, 0, Math.PI * 2, true)
      ctx.fill()

      ctx.beginPath()
      ctx.arc(89, 102, 2, 0, Math.PI * 2, true)
      ctx.fill()
    }
  }

  // 封装的一个用于绘制圆角矩形的函数.
  roundedRect (ctx, x, y, width, height, radius) {
    ctx.beginPath()
    ctx.moveTo(x, y + radius)
    ctx.lineTo(x, y + height - radius)
    ctx.quadraticCurveTo(x, y + height, x + radius, y + height)
    ctx.lineTo(x + width - radius, y + height)
    ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius)
    ctx.lineTo(x + width, y + radius)
    ctx.quadraticCurveTo(x + width, y, x + width - radius, y)
    ctx.lineTo(x + radius, y)
    ctx.quadraticCurveTo(x, y, x, y + radius)
    ctx.stroke()
  }

这段代码的成品就是吃豆子

我把它嵌入到react的项目里面去了。

git 地址:
git@github.com:hoyong6/my-reactapp.git

然而,之后可能还会在里面加入乱七八糟的东东。