使用ipairs()中的函数时,LÖVE会崩溃。

我正在进行一个实验,看我是否能够在 LÖVE 中使用自动生成种子,但我遇到了一个问题。当我尝试使用 ipairs 在表中添加瓷砖到游戏中时,它会崩溃。 有人能看出这个代码的问题吗?:

    world = {}

function world.generate()
        for i = 1, 100 do
                world.addTile(i, love.math.random(1, 3), 1)
        end
        local tempWorld = world
        for i,v in ipairs(tempWorld) do
                world.addTile(v.x, v.y+1, 1)
        end
end

function world.addTile(x, y, id)
        for i,v in ipairs(tile) do
                if v.id == id then
                        table.insert(world, {id = id, x = x*tile.w, y = y*tile.h})
                else
                        print("未识别以下 id:"..id)
                end
        end
end

function world.draw()
        for i,v in ipairs(world) do
                love.graphics.draw(tile.getImage(v.id), v.x, v.y)
        end
end
点赞
用户2726734
用户2726734

你有一个无限循环。

local tempWorld = world 并没有复制 world,它只是创建了另一个对它的引用。所以当 world.addTile 添加了另一个项时,for 循环:

for i,v in ipairs(tempWorld) do
   world.addTile(v.x, v.y+1, 1)
end

有一个新的停止点,因为 ipairs 有一个更多的项来迭代。这会一直重复,直到内存耗尽。你可能想保存旧列表的大小:

local oldsize = #world
for i=1, oldsize do
   local v = world[i]
   world.addTile(v.x, v.y+1, 1)
end

现在它不会超过 oldsize 次迭代。

2015-02-20 23:18:19