新冠病毒:timer.cancel()返回“尝试对零值进行索引”的错误。

我试图取消在另一个“触摸事件”函数中启动的定时器,如下所示:

local function startNewGame(event)
if(event.phase=="ended")then
    local function animationImmaginiOggetti()
      for i=1, 7 do
        transition.to(immaginiOggettiAvvioPartita[i],
                      { time = 200, delay = 0, xScale = 0, yScale = 0, alpha = 0})
      end
    end
    local function removeImmaginiOggetti()
        if immaginiOggettiAvvioPartita[1] then
            for i=1, 11 do
                immaginiOggettiAvvioPartita[i]:removeSelf()
                immaginiOggettiAvvioPartita[i] = nil
            end
        end
    end

    local tmrAIO = timer.performWithDelay(4000, animationImmaginiOggetti, 1)
    local tmrRIO = timer.performWithDelay(4250, removeImmaginiOggetti, 1)
end
end

local function replayGame(event)
    if(event.phase=="ended")then
        timer.cancel(tmrAIO)
        timer.cancel(tmrRIO)
    end
end

startBTN:addEventListener("touch", startNewGame)
replayBTN:addEventListener("touch", replayGame)

我的问题是Corona返回

“File : ? 尝试索引空值”在计时器取消(tmrAIO)上。

我做错了什么?

点赞
用户1517755
用户1517755

问题如下,变量 tmrAIOtmrRIO 局限于函数 startNewGame,这意味着它们只能从 startNewGame 定义的作用域中访问,现在您正在尝试从该函数之外访问它们,它们在该作用域中未定义,这就是出现 nil 值的原因。

解决方案:

local tmrAIO
local tmrRIO

local function startNewGame(event)
    if(event.phase=="ended")then
        local function animationImmaginiOggetti()
          for i=1, 7 do
            transition.to(immaginiOggettiAvvioPartita[i],
                          {time = 200, delay = 0, xScale = 0, yScale = 0, alpha = 0})
          end
        end
        local function removeImmaginiOggetti()
            if immaginiOggettiAvvioPartita[1] then
                for i=1, 11 do
                    immaginiOggettiAvvioPartita[i]:removeSelf()
                    immaginiOggettiAvvioPartita[i] = nil
                end
            end
        end

        tmrAIO = timer.performWithDelay(4000, animationImmaginiOggetti, 1)
        tmrRIO = timer.performWithDelay(4250, removeImmaginiOggetti, 1)
    end
end

local function replayGame(event)
    if(event.phase=="ended")then
        timer.cancel(tmrAIO)
        timer.cancel(tmrRIO)
    end
end

startBTN:addEventListener("touch", startNewGame)
replayBTN:addEventListener("touch", replayGame)

正如您所看到的,我将 tmrAIOtmrRIO 声明在 startNewGame 的作用域之外,使它们可以在该文件的任何地方进行访问。

2015-09-06 03:36:02