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.
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
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. –