尝试索引字段'?' (零值) - 错误

时间:2014-02-24 17:28:26

标签: lua corona

我无法弄清楚我的代码有什么问题,但我想要实现的是让常规的块生成滚动到屏幕上,玩家必须躲闪。当每个块离开屏幕的左侧时,它会增加“障碍值+1”

我遇到的问题是,当我的“阻止”对象离开屏幕时,我收到此错误:

“尝试索引字段'?' (零值)“

任何人都可以帮助我,因为我真的被卡住了。 谢谢

local yPos = {50,110,200}
local speed = 6
local block = {}
local obstacles = 0


function createBlock(event)
  local rnd = math.floor(math.random() * 4) + 1
  b = display.newImage('images/block3.png', display.contentWidth, yPos[math.floor(math.random() * 3)+1])
  b.x = 480
  b.name = 'block'
  physics.addBody(b, "static")
  blocks:insert(b)
  print(b.x)

  return true

end

function gameLoop( event )
   if(blocks ~= nil)then
     for i = 1, blocks.numChildren do
      blocks[i].x = blocks[i].x - speed -- (( THIS IS THE LINE WHICH GENERATES THE ERROR))
       if(blocks[i].x < -0) then
         display.remove(blocks[i])
         blocks[i] = nil
         print("+1!!")
         obstacles = obstacles +1
       end
     end 
  end
end


timerSrc = timer.performWithDelay(900, createBlock, 0)
Runtime:addEventListener("enterFrame", gameLoop)

3 个答案:

答案 0 :(得分:2)

您在这里打电话display.remove(blocks[i])这很好,但是在您设置blocks[i]=nil之后就行了。日冕医生没有迹象表明这是一项有效的操作。

此外,一旦删除了该对象,它就不再属于该组,因此确实blocks[i]=nil不正确:您可能正在尝试下一个块!我不能在这里检查,但是在这个循环之前和之后打印要删除的对象的id会很有趣。您可能会发现在执行display.remove(blocks[4])之前(选择i = 4,因此示例更清晰)块[4]与后面的对象不同,因此实际上您要移除两个对象(第二个对象被错误地删除) )。

如果blocks是常规表而不是用户数据,问题会有所不同,但您仍然会遇到问题(超出您的问题范围;但我建议您尝试一下!)。

答案 1 :(得分:1)

我认为问题出在屏幕外对象上。当物体移出可见组时,它变为零。所以你不能访问该对象。 在移出可视屏幕之前,您需要定义该对象的alpha = 0或isVisible = false,然后才能访问该对象。

答案 2 :(得分:0)

如果你“超出界限”,你会得到那个错误。如果您尝试运行代码,但尝试访问表blocksnil的索引,那么您将收到该错误。

我的猜测是,它与你在那里发生的numChildren事情有关。不确定它来自哪里,但我建议使用默认的#运算符来衡量表格的大小。

例如:

for i = 1, #blocks do
    ...
end

甚至使用迭代器:

for i, block in ipairs(blocks) do
    ...
end

另一种可能性是你的blocks:insert()方法没有按顺序插入值,从0开始插入,或者甚至不使用数字索引(尽管有疑问)。

在这种情况下,我建议使用标准table.insert(blocks, b)

相关问题