每当我对数组执行类似的操作时,都会遇到一个非常令人讨厌的错误。我有在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


更加轻松的方法是使用ipairstable.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


objectArraymovingLeft应该作为参数传递...

08-28 19:08