尝试索引字段“?”(一个空值)- 错误。

我无法确定我的代码出了什么问题,但我想实现的是定期刷出方块来滚动屏幕,玩家必须躲避。每个方块滑过屏幕左侧时,都会将“障碍物值+1”

我的问题是,当我的'block'对象滑过屏幕时,我会得到这个错误:

“试图索引字段“?”(一个空值)”

能否有人帮助我,因为我真的不知道如何解决这个问题。 谢谢

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 -- ((这是产生错误的一行))
       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)
点赞
用户2077120
用户2077120

如果您尝试运行代码,但尝试访问表“blocks”中为“nil”的索引,则会出现此错误。我猜想这与您正在进行的“numChildren”有关。不确定它来自何处,但我建议使用默认的#运算符来测量表的大小。

例如:

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

甚至可以使用迭代器:

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

另一个可能性是您的blocks:insert()方法没有按顺序插入值,以0为起点进行插入,甚至没有使用数字索引(尽管这很少见)。

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

2014-02-24 18:42:12
用户869951
用户869951

在这里,你调用了display.remove(blocks[i]),这是可以的,但是在接下来的一行中,你设置了blocks[i]=nil。从corona文档中没有迹象表明这是一个有效的操作。

而且,一旦对象被移除,它就不再在组中,所以肯定做blocks[i]=nil是不正确的:你可能会将下一个块变为空!我无法在这里检查,但是在循环中删除i对象之前和之后,打印对象的id是很有趣的。你可能会发现,在执行display.remove(blocks[4])(选择i = 4以使示例更清晰)之前,blocks[4]与之后不是同一对象,因此实际上你正在删除两个对象(第二个对象被错误地删除)。

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

2014-02-24 20:24:35
用户2409015
用户2409015

我认为问题出在屏幕外的物体上。当物体移动出可见组时,它就变成了空值。因此,您不能访问该对象。 您需要在移出可见屏幕之前将该对象的 alpha = 0 或 isVisible = false 定义,并且然后您就可以访问该对象了。

2014-02-25 07:29:16