我无法弄清楚我的代码有什么问题,但我想要实现的是让常规的块生成滚动到屏幕上,玩家必须躲闪。当每个块离开屏幕的左侧时,它会增加“障碍值+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)
答案 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)
如果你“超出界限”,你会得到那个错误。如果您尝试运行代码,但尝试访问表blocks
中nil
的索引,那么您将收到该错误。
我的猜测是,它与你在那里发生的numChildren
事情有关。不确定它来自哪里,但我建议使用默认的#
运算符来衡量表格的大小。
例如:
for i = 1, #blocks do
...
end
甚至使用迭代器:
for i, block in ipairs(blocks) do
...
end
另一种可能性是你的blocks:insert()
方法没有按顺序插入值,从0开始插入,或者甚至不使用数字索引(尽管有疑问)。
在这种情况下,我建议使用标准table.insert(blocks, b)