Lua/LOVE索引问题

4

每当我像这样使用数组做任何事情时,都会出现非常烦人的错误。我有一段代码在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

当然,我剪掉了一些不必要的代码(数组中的额外参数,例如宽度和高度),但你可以理解。当我设置这段代码以创建一个对象并渲染它时,我遇到了以下错误:

attempt to index '?' (a nil value)

它所指的行是这一行:
renderX = objectArray[arraySearch]["X"]

有人知道这里出了什么问题,我该如何预防它发生在未来?我真的需要帮助。

1个回答

6
“这是一个差一错误:”
arraySearch = 0
while arraySearch <= arrayLength do
    arraySearch = arraySearch + 1

您需要循环 arrayLength+1 次,遍历索引 1..arrayLength+1。但您只想在索引 1..arrayLength 的情况下循环 arrayLength 次。解决方案是将条件更改为 arraySearch < arrayLength

另一种(更符合Lua的方式)是这样写:

for arraySearch = 1, #objectArray do

更符合Lua风格的方式是使用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可能应该作为参数传递...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接