为什么我的定时器倒计时,不是每秒出发,差不多间隔5秒左右才触发

来源:4-2 使用canvas做个物理实验

weixin_慕盖茨0107189

2022-02-09 14:51


const WINDOW_HEIGHT = 768

const RADIUS = 8

const MARGIN_TOP = 60

const MARGIN_LEFT = 30


const endTime = new Date(2022, 2, 9, 14, 00, 00)

let curShowTimeSeconds = 0


window.onload = function () {

  let canvas = document.getElementById('canvas')

  let context = canvas.getContext('2d')


  canvas.width = WINDOW_WIDTH

  canvas.height = WINDOW_HEIGHT


  curShowTimeSeconds = getCurrentShowTimeSeconds()

  setInterval(() => {

    render(context)

    update()

  }, 50);

}


function getCurrentShowTimeSeconds() {

  let curTime = new Date()

  let ret = endTime.getTime() - curTime.getTime()

  ret = Math.round(ret / 10000)

  return ret >= 0 ? ret : 0

}


function update() {

  let nextShowTimeSeconds = getCurrentShowTimeSeconds()


  let nextHours = parseInt(nextShowTimeSeconds / 3600)

  let nextMinutes = parseInt((nextShowTimeSeconds - nextHours * 3600) / 60)

  let nextSeconds = nextShowTimeSeconds % 60


  let curHours = parseInt(curShowTimeSeconds / 3600)

  let curMinutes = parseInt((curShowTimeSeconds - curHours * 3600) / 60)

  let curSeconds = curShowTimeSeconds % 60


  if (nextSeconds != curSeconds) {

    curShowTimeSeconds = nextShowTimeSeconds

  }

}


function render(cxt) {


  // 对矩形进行刷新操作

  cxt.clearRect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT)


  let hours = parseInt(curShowTimeSeconds / 3600)

  let minutes = parseInt((curShowTimeSeconds - hours * 3600) / 60)

  let seconds = curShowTimeSeconds % 60


  // 时钟

  renderDigit(MARGIN_LEFT, MARGIN_TOP, parseInt(hours / 10), cxt)

  renderDigit(MARGIN_LEFT + 15 * (RADIUS + 1), MARGIN_TOP, parseInt(hours % 10), cxt)

  renderDigit(MARGIN_LEFT + 30 * (RADIUS + 1), MARGIN_TOP, 10, cxt)

  // 分钟

  renderDigit(MARGIN_LEFT + 39 * (RADIUS + 1), MARGIN_TOP, parseInt(minutes / 10), cxt)

  renderDigit(MARGIN_LEFT + 54 * (RADIUS + 1), MARGIN_TOP, parseInt(minutes % 10), cxt)

  renderDigit(MARGIN_LEFT + 69 * (RADIUS + 1), MARGIN_TOP, 10, cxt)

  // 秒钟

  renderDigit(MARGIN_LEFT + 78 * (RADIUS + 1), MARGIN_TOP, parseInt(seconds / 10), cxt)

  renderDigit(MARGIN_LEFT + 93 * (RADIUS + 1), MARGIN_TOP, parseInt(seconds % 10), cxt)

}


function renderDigit(x, y, num, cxt) {


  cxt.fillStyle = "skyblue"

  for (let i = 0; i < digit[num].length; i++) {

    for (let j = 0; j < digit[num][i].length; j++) {

      if (digit[num][i][j] == 1) {

        cxt.beginPath()

        cxt.arc(x + j * 2 * (RADIUS + 1) + (RADIUS + 1), y + i * 2 * (RADIUS + 1) + (RADIUS + 1), RADIUS, 0, 2 * Math.PI)

        cxt.closePath()


        cxt.fill()

      }

    }

  }

}


写回答 关注

1回答

  • 吐丝蚕宝宝
    2023-04-06 18:19:28

    http://img4.mukewang.com/642e9c9f00012c4813500675.jpg

    看图哈,这里除了10000,多了个0

炫丽的倒计时效果Canvas绘图与动画基础

学习HTML5中最激动人心的技术Canvas,彻底释放自己的创造力

96746 学习 · 1000 问题

查看课程

相似问题