Lua: timer.cancel --› 'Попытка проиндексировать нулевое значение'

Я новичок в Lua, и одна конкретная команда в моем коде вызывала у меня серьезные проблемы.

Я пытался отменить таймер:

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)

Любая помощь будет принята с благодарностью.


person james42    schedule 08.08.2017    source источник
comment
Вы проверили содержимое currentPuddleDelay? Вы уверены, что он доступен в строке, где выполняется timer.cancel()? Взгляните на аналогичный вопрос: stackoverflow.com/questions/32403817/   -  person Electrix    schedule 08.08.2017
comment
Почему вы устанавливаете puddle = nil внутри onPuddleCollision? Это приведет к попытке индексировать ошибку нулевого значения, если один и тот же экземпляр onPuddleCollision вызывается дважды с event.phase == "began" оба раза.   -  person Tanner Swett    schedule 08.08.2017


Ответы (1)


Я могу только догадываться, поскольку вы, скорее всего, не предоставили весь соответствующий код.

Очевидно, что нет смысла отменять несуществующий таймер, поэтому для начала просто выполните

if currentPuddleDelay then timer.cancel(currentPuddleDelay) end

Если есть какая-то причина, по которой currentPuddleDelay все еще должен существовать, вы должны выяснить, почему он равен нулю.

person Piglet    schedule 08.08.2017