2017-08-08 4 views
0

私はかなりLuaを使い始めています。私のコードのある特定のコマンドが私に大きな問題を引き起こしています。Lua:timer.cancel - > 'nil値のインデックスを作成しようとしました'

currentPuddleDelay = timer.performWithDelay(puddleDelay, createPuddle); 

Iが示されていますエラーは次のとおりです:

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 == "で2回呼び出され、両方の時間が始まった場合、"無限値のインデックスを作成しようとする "エラーを生成します。 –

答えて

1

すべての関連コードを提供していない可能性が高いからです。

それは明らかにcurrentPuddleDelayはまだそれがnilである理由を見つける必要がありますが存在しなければならない理由はどのような理由がある場合だけ

if currentPuddleDelay then timer.cancel(currentPuddleDelay) end 

を行うには、開始のためのように、非既存のタイマーをキャンセルしても意味がありません。

関連する問題