2017-08-08 6 views
0

Je suis assez nouveau pour Lua, et une commande particulière dans mon code m'a causé quelques problèmes majeurs.Lua: timer.cancel -> 'Tentative d'indexer une valeur nulle'

J'ai essayé d'annuler la minuterie:

currentPuddleDelay = timer.performWithDelay(puddleDelay, createPuddle); 

L'erreur que je me montre est:

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> 

D'après ce que je l'ai déjà fait des recherches, ce problème peut se produire lorsque le timer est dans une fonction et est local, cependant, le timer dans mon code est global, donc je ne pense pas que ce soit le problème.

Ci-dessous le morceau de code avec la question:

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); 

Et puis plus tard dans le programme:

timer.cancel(currentPuddleDelay) 

Toute aide serait grandement appréciée.

+0

Avez-vous vérifié le contenu de 'currentPuddleDelay'? Êtes-vous sûr qu'il est accessible sur la ligne où 'timer.cancel()' est exécuté? Jetez un oeil à la question similaire: https://stackoverflow.com/questions/32403817/corona-timer-cancel-returns-attempt-to-index-a-nil-value – Electrix

+0

Pourquoi définissez-vous 'puddle = nil' à l'intérieur' onPuddleCollision'? Cela produira une erreur "tenter d'indexer une valeur nulle" si la même instance de "onPuddleCollision" est appelée deux fois avec 'event.phase ==" commencé "' les deux fois. –

Répondre

1

Je peux seulement deviner que vous n'avez probablement pas fourni tout le code pertinent.

Il n'a évidemment pas de sens d'annuler une minuterie non existante pour le début le faire

if currentPuddleDelay then timer.cancel(currentPuddleDelay) end 

S'il n'y a aucune raison pour laquelle currentPuddleDelay devrait encore vous existez doit savoir pourquoi il est nul.