CE Lua中使用自定义进度条的倒计时定时器

抱歉我的英语不好。 我使用CE GUI制作了带有自定义进度条的倒计时计时器,使用CE Panel width。

对于倒计时计时器来说,这个函数可以正常工作。

    function performWithDelay(delay,onFinish,onTick,onTickInterval)

    if type(delay)~='number' -- 必填项
    then error('delay不是一个数字') end

    if type(onFinish)~='function'  -- 必填项
    then error('onFinish不是一个函数') end

    if onTick and type(onTick)~='function' -- 可选项
    then error('onTick不是一个函数') end

    if onTickInterval and type(onTickInterval)~='number'  -- 可选项,默认为1秒
    then error('onTickInterval不是一个数字') end
    onTickInterval = onTickInterval or 1000 -- 默认为1秒

    local f = function (t) -- 线程函数开始
    local getTickCount = getTickCount
    local startTick = getTickCount()
    local endTick = startTick + delay
    local nextOnTick = startTick + onTickInterval
    local ticks

    if onTick then
     while true do
     ticks=getTickCount()
      if nextOnTick<ticks then
       nextOnTick=ticks+onTickInterval
       synchronize(onTick,endTick-ticks)
      end
     if endTick<ticks then break end
     sleep(1)
     end
     else
    while true do
    ticks=getTickCount()
    if endTick<ticks then break end
    sleep(1)
    end
   end

  if onFinish then synchronize(onFinish) end
  end -- 线程函数结束

  local t = createNativeThreadSuspended(f)
  t.name = 'performWithDelay thread'
  t.resume()
  end

   function showTimeLeft(millisecondsLeft)
    local totalSeconds = millisecondsLeft // 1000
    local deciseconds = (millisecondsLeft % 1000) // 100
    LabelTimer.Caption = os.date("!%M:%S",totalSeconds)..'.'..deciseconds
   end

   function whenFinished()
    LabelTimer.Caption = "00:00.0"
    -- 做一些事情
    ButtonTimer.Enabled = true
   end

   function startCountDown()
    -- 做一些事情
    performWithDelay(20000,whenFinished,showTimeLeft,10)
    --- 20000 = 20秒
    ButtonTimer.Enabled = false
   end

   ButtonTimer.onClick = startCountDown

现在,对于自定义进度条,我创建了一个定时器和已知变量:

  progressbar.width = 0  -- 起始位置
  progessbar 最大宽度 = 208  -- 结束位置
  时间 = 20秒
  定时器间隔 = 1001/10秒)
  进度条步骤 = ??

如何使用纯Lua脚本计算进度条宽度以在倒计时计时器为0时达到最大宽度?

点赞
用户3670853
用户3670853

解决方案:

   function start()
    st = edtSpTimer.Text  -- 从用户输入获取多少秒
    if tonumber(st) == nil then return nil end  -- 只接受数字
    sec = tonumber(st) -- 将文本转换为数字
    pnPBar.Width = 208 -- 将面板宽度设置为最大的进度条值
    step = 208 / sec   -- 根据值设置步骤
    tmr.Enabled = true -- 触发计时器
    performWithDelay(st*1000,whenFinished,showTimeLeft,10)
   end

   function bar()
    sec = sec - 1   -- 倒数秒数
    pnPBar.width = pnPBar.width - step   -- 减少进度条宽度
   end

   tmr = createTimer()   -- 计时器
   tmr.interval = 1000   -- 将间隔设置为1000 = 1秒
   tmr.enabled = false
   tmr.OnTimer = bar
2019-06-08 02:20:23