2017-08-08 6 views
0

Ich bin ziemlich neu zu Lua, und ein bestimmter Befehl in meinem Code hat mir einige große Probleme verursacht.Lua: timer.cancel -> 'Versuch, einen Nullwert zu indexieren'

Ich habe versucht, den Timer abzubrechen:

currentPuddleDelay = timer.performWithDelay(puddleDelay, createPuddle); 

Der Fehler, der mir gezeigt ist:

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> 

Von dem, was ich bereits erforscht haben, kann dieses Problem auftreten, wenn die Timer ist innerhalb einer Funktion und ist lokal, aber der Timer in meinem Code ist global, also glaube ich nicht, dass das das Problem ist.

unten ist das Stück Code, mit dem Thema:

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

Und dann später im Programm:

timer.cancel(currentPuddleDelay) 

Jede Hilfe wäre sehr dankbar.

+0

Haben Sie den Inhalt von 'currentPuddleDelay' überprüft? Sind Sie sicher, dass es in der Zeile, in der 'timer.cancel()' ausgeführt wird, erreichbar ist? Sehen Sie sich ähnliche Fragen an: https://stackoverflow.com/questions/32403817/corona-timer-cancel-returns-attempt-to-index-a-nil-value – Electrix

+0

Warum setzen Sie 'puddle = nil' inside' onPuddleCollision'? Dies führt zu einem Fehler "Versuch, einen Nullwert zu indexieren", wenn dieselbe Instanz von 'onPuddleCollision' zweimal mit 'event.phase ==" started "aufgerufen wird. –

Antwort

1

Ich kann nur raten, wie Sie wahrscheinlich nicht alle relevanten Code zur Verfügung gestellt haben.

Es ist offensichtlich nicht sinnvoll, einen nicht vorhandenen Timer abzubrechen so für den Start nur

if currentPuddleDelay then timer.cancel(currentPuddleDelay) end 

tun Wenn es einen Grund gibt, warum currentPuddleDelay noch existieren sollte, sollten Sie herausfinden, warum es gleich Null ist.

Verwandte Themen