2017-08-08 84 views
0

我对Lua相当陌生,在我的代码中一个特定的命令一直在导致我一些主要问题。Lua:timer.cancel - >'试图索引一个零值'

我一直在试图取消计时器:

currentPuddleDelay = timer.performWithDelay(puddleDelay, createPuddle); 

,我显示的错误是:

Attempt to index a nil value 

File: ? 

stack traceback: 
?: in function 'cancel' 
game.lua:534: in function '?' 
?: in function 'dispatchEvent' 
?: in function '_saveSceneAndHide' 
?: in function 'gotoScene' 
game.lua:452: in function '?' 
?: in function <?:182> 

从我已经研究过,可能会出现这个问题时,计时器是在一个函数内,是本地的,但是,我的代码中的计时器是全局的,所以我不认为这是问题所在。

下面的代码问题的位:

local function createPuddle() 
    local function constantDelay() 

     local puddle = display.newImage(sceneGroup, "images/puddle.png") 
     puddle.x = puddleLane 
     puddle.y = -200 

     physics.addBody(puddle, "dynamic", {density=0, filter=puddleCollisionFilter}) 
     puddle:applyForce(0, puddleSpeed, puddle.x, puddle.y) 
     sceneGroup:insert(3,puddle) 

     local function onPuddleCollision(self, event) 
      if (event.phase == "began") then 
       print('puddle collision') 
       puddle:removeSelf() 
       puddle = nil 
       composer.gotoScene("menu") 
      end 
     end 
     puddle.collision = onPuddleCollision 
     puddle:addEventListener("collision") 
    end 

    local constantDelayTimer = timer.performWithDelay(puddleDelay/2,constantDelay,1) 
    currentPuddleDelayHold = timer.performWithDelay(puddleDelay, createPuddle); 
end 

currentPuddleDelay = timer.performWithDelay(puddleDelay, createPuddle); 
在节目

再后来就:

timer.cancel(currentPuddleDelay) 

任何帮助将不胜感激。

+0

你是否检查过'currentPuddleDelay'的内容?你确定它可以在执行'timer.cancel()'的行上访问吗?看看类似的问题:https://stackoverflow.com/questions/32403817/corona-timer-cancel-returns-attempt-to-index-a-nil-value – Electrix

+0

你为什么设置'puddle = nil'里面' onPuddleCollision'?如果两次调用'onPuddleCollision'的同一个实例并且两次调用'event.phase ==',那么这将产生一个“尝试索引nil值”的错误。 –

回答

1

我只能猜测你最有可能没有提供所有相关的代码。

这显然是没有意义的,取消一个不存在的定时器所以一开始只是做

if currentPuddleDelay then timer.cancel(currentPuddleDelay) end 

如果有任何理由currentPuddleDelay应该依然存在,你应该找出为什么是零。

相关问题