当前位置: 代码网 > it编程>网页制作>html5 > canvas版人体时钟的实现示例

canvas版人体时钟的实现示例

2021年01月29日 html5 我要评论
canvas版人体时钟的实现示例这篇文章主要介绍了canvas版人体时钟的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 21-01-29

不知道老网民们还记不记得这个魔性的时钟插件:

作为网上冲浪十数载的网虫,不久前看到这个图瞬间破防,直接梦回10年前的qq空间,感叹一下岁月蹉跎、时光荏苒、青春不在、不胜唏嘘。

十年后的今天,flash在各个浏览器都已经不再支持,已经是个不再那个只会用脚本打扮qq空间的我,自然得用青春换来得技术还原一下自己的青春记忆。

首先感谢原作者提供的如此优秀好玩的插件: http://chabudai.org/blog/?p=59

这次为了图方便,就直接那pixi.js来上手做动画了,动画素材来源于油管视频,拿到ps逐帧抠图并导出,这个过程就不再详细介绍了。合成后的精灵图以及对应的json文件我会放在文章末尾。

核心的api是pixi.animatedsprite

代码也是很短,就直接放到下面了

<!doctype html>
<html lang="zh-cn">
<head>
  <meta charset="utf-8">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  <title>honehoneclock</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }
    html, body {
      width: 100%;
      height: 100%;
    }
    body {
      background-color: lightcyan;
    }
    canvas {
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      height: 100%;
      z-index: 1;
    }
  </style>
</head>
<body>
<canvas class="canvas"></canvas>
<script src="pixi_5.3.4.min.js"></script>
<script src="stats.min.js"></script>
<script>

  (async function () {
    const stats = new stats()
    document.body.appendchild(stats.domelement)

    let pagewidth = 0
    let pageheight = 0

    let clockhour1, clockhour2
    let clockmin1, clockmin2
    let clocksec1, clocksec2
    const $canvas = document.queryselector('canvas')
    const renderer = new pixi.renderer({
      view: $canvas,
      width: pagewidth,
      height: pageheight,
      transparent: true,
      autodensity: true,
      antialias: true
    })

    // 人体时钟
    class clock extends pixi.container {
      constructor (name) {
        super()
        const textures = loader.resources[honehoneclockjson].textures
        let frames = []
        let anidata = []
        if (this.frames) {
          frames = this.frames
          anidata = this.anidata
        }
        else {
          anidata = [
            {
              prefix: '0',
              count: 6,
              framefrom: -1,
              frameto: -1,
            },
            {
              prefix: '1',
              count: 9,
              framefrom: -1,
              frameto: -1,
            },
            {
              prefix: '2',
              count: 7,
              framefrom: -1,
              frameto: -1,
            },
            {
              prefix: '3',
              count: 6,
              framefrom: -1,
              frameto: -1,
            },
            {
              prefix: '4',
              count: 9,
              framefrom: -1,
              frameto: -1,
            },
            {
              prefix: '5',
              count: 14,
              framefrom: -1,
              frameto: -1,
            },
            {
              prefix: '6',
              count: 7,
              framefrom: -1,
              frameto: -1,
            },
            {
              prefix: '7',
              count: 10,
              framefrom: -1,
              frameto: -1,
            },
            {
              prefix: '8',
              count: 7,
              framefrom: -1,
              frameto: -1,
            },
            {
              prefix: '9',
              count: 9,
              framefrom: -1,
              frameto: -1,
            },
          ]
          let k = 0
          for (let i = 0; i < anidata.length; i++) {
            const data = anidata[i]
            data.framefrom = k
            for (let j = 1; j <= data.count; j++) {
              k++
              frames.push(textures[`${data.prefix}(${j}).png`])
            }
            data.frameto = k - 1
          }
          this.frames = frames
          this.anidata = anidata
        }
        const ani = new pixi.animatedsprite(frames)
        ani.anchor.set(0.5, 1)
        ani.animationspeed = 0.4

        this.stopat = -1
        ani.onframechange = () => {
          if (ani.currentframe === this.stopat) {
            ani.stop()
          }
        }
        this.addchild(ani)
        this.name = name
        this.ani = ani
        this.num = -1
      }

      set number (number) {
        if (this.num !== number) {
          this.num = number
          this.stopat = this.anidata[number].frameto
          this.ani.gotoandplay(this.anidata[number].framefrom)
        }
      }
    }

    const stage = new pixi.container()
    stage.name = 'stage'
    let clockwrap

    const ticker = new pixi.ticker()
    let now = new date()
    let lasttime = now.gettime()
    const loop = function () {
      stats.begin()
      now = new date()
      if (now.gettime() - lasttime >= 1000) {
        let hours = now.gethours()
        if (hours > 9) {
          clockhour1.number = math.floor(hours / 10)
          clockhour2.number = hours % 10
        }
        else {
          clockhour1.number = 0
          clockhour2.number = hours
        }

        let minutes = now.getminutes()
        if (minutes > 9) {
          clockmin1.number = math.floor(minutes / 10)
          clockmin2.number = minutes % 10
        }
        else {
          clockmin1.number = 0
          clockmin2.number = minutes
        }

        let seconds = now.getseconds()
        if (seconds > 9) {
          clocksec1.number = math.floor(seconds / 10)
          clocksec2.number = seconds % 10
        }
        else {
          clocksec1.number = 0
          clocksec2.number = seconds
        }
        lasttime = now.gettime()
      }
      renderer.render(stage)
      stats.end()
    }

    ticker.add(loop)

    const honehoneclockjson = 'honehoneclock.json'
    const loader = new pixi.loader()
    loader.add([honehoneclockjson])
    loader.oncomplete.add(async (res) => {
      clockwrap = new pixi.container()
      clockwrap.position.set((pagewidth - 630) * 0.5, (pageheight + 150) * 0.5)

      clockhour1 = new clock('hour')
      clockhour2 = new clock('hour')
      clockmin1 = new clock('min')
      clockmin2 = new clock('min')
      clocksec1 = new clock('sec')
      clocksec2 = new clock('sec')
      clockhour1.position.set(0, 0)
      clockhour2.position.set(100, 0)
      clockmin1.position.set(250, 0)
      clockmin2.position.set(350, 0)
      clocksec1.position.set(500, 0)
      clocksec2.position.set(600, 0)
      clockwrap.addchild(clockhour1)
      clockwrap.addchild(clockhour2)
      clockwrap.addchild(clockmin1)
      clockwrap.addchild(clockmin2)
      clockwrap.addchild(clocksec1)
      clockwrap.addchild(clocksec2)
      stage.addchild(clockwrap)

      // 开始动画循环
      ticker.start()
    })
    loader.load()

    const onresize = (e) => {
      pagewidth = document.body.clientwidth
      pageheight = document.body.clientheight
      if (clockwrap) {
        clockwrap.position.set((pagewidth - 630) * 0.5, (pageheight + 150) * 0.5)
      }
      renderer.resize(pagewidth, pageheight)
    }

    onresize()

    window.onresize = onresize
  })()
</script>
</body>
</html>

完整代码戳这里

在线演示1 在线演示2

到此这篇关于canvas版人体时钟的实现示例的文章就介绍到这了,更多相关canvas人体时钟内容请搜索代码网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com