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

もちろん、いくつかの不要なコード (幅や高さなどの配列内の余分なパラメーターのみ) を切り取りましたが、要点は理解できました。1 つのオブジェクトを作成してレンダリングするようにこのコードをセットアップすると、次のエラーが発生します。

attempt to index '?' (a nil value)

それが指す行は次の行です。

renderX = objectArray[arraySearch]["X"]

ここで何が問題なのか、将来それを防ぐ方法を知っている人はいますか? これについて本当に助けが必要です。

4

1 に答える 1

6

それはオフバイワンエラーです:

arraySearch = 0
while arraySearch <= arrayLength do
    arraySearch = arraySearch + 1

インデックスを通過して、ループarrayLength+1回数を実行します1..arrayLength+1arrayLengthインデックスを使用して回数だけループを実行したい1..arrayLength。解決策は、条件を に変更することarraySearch < arrayLengthです。

もう 1 つの (より Lua 的な方法) は、次のように記述することです。

for arraySearch = 1, #objectArray do

さらに Lua らしい方法は、 ( )の代わりに使用ipairsして参照することです。table.fieldtable["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おそらくパラメータとして渡す必要があります...

于 2013-09-12T15:39:43.427 に答える