每当我对数组执行类似的操作时,都会遇到一个非常令人讨厌的错误。我有在love.load()函数中设置数组的代码:
function iceToolsInit()
objectArray = {} --for object handling
objectArrayLocation = 0
end
然后是允许创建对象的代码。它基本上会获取有关该对象的所有信息,并将其插入数组。
function createObject(x, y, renderimage) --used in the load function
--objectArray is set up in the init function
objectArrayLocation = objectArrayLocation + 1
objectArray[objectArrayLocation] = {}
objectArray[objectArrayLocation]["X"] = x
objectArray[objectArrayLocation]["Y"] = y
objectArray[objectArrayLocation]["renderimage"] =
love.graphics.newImage(renderimage)
end
之后,更新函数将读取objectArray并相应地渲染图像:
function refreshObjects() --made for the update function
arrayLength = #objectArray
arraySearch = 0
while arraySearch <= arrayLength do
arraySearch = arraySearch + 1
renderX = objectArray[arraySearch]["X"]
renderY = objectArray[arraySearch]["Y"]
renderimage = objectArray[arraySearch]["renderimage"]
if movingLeft == true then --rotation for rightfacing images
renderRotation = 120
else
renderRotation = 0
end
love.graphics.draw(renderimage, renderX, renderY, renderRotation)
end
end
我当然剪裁了一些不需要的代码(只是数组中的其他参数,例如width和height),但是您可以理解要点。当我将此代码设置为一个对象并进行渲染时,出现此错误:
attempt to index '?' (a nil value)
它指向的行是以下行:
renderX = objectArray[arraySearch]["X"]
有谁知道这是怎么回事,以及将来如何预防?我真的需要帮助。
最佳答案
这是一个错误的错误:
arraySearch = 0
while arraySearch <= arrayLength do
arraySearch = arraySearch + 1
您遍历循环
arrayLength+1
次数,遍历索引1..arrayLength+1
。您只想通过索引arrayLength
循环1..arrayLength
次。解决方案是将条件更改为arraySearch < arrayLength
。另一种(更轻松的方式)是这样写:
for arraySearch = 1, #objectArray do
更加轻松的方法是使用
ipairs
和table.field
引用而不是(table["field"]
):function refreshObjects()
for _, el in ipairs(objectArray) do
love.graphics.draw(el.renderimage, el.X, el.Y, movingLeft and 120 or 0)
end
end
objectArray
和movingLeft
应该作为参数传递...