Lua 3D表缺乏物体的永久性(键值不一致地匹配到表数据)

所以我在Lua中遇到了一个有点奇怪的问题,我使用以下函数设置、读取和从全局3D "array" 中写入数据,名为 Cube。但是似乎每次我读取或写入此 "array" 时,数据仅存储在函数使用的实例上,尽管 Cube 是全局变量,这个问题我从未遇到过,非常奇怪。

-- 从中偷了这一个:https://stackoverflow.com/questions/27976526/using-a-coordinate-pair-as-a-key-in-a-lua-table
-- 基本上预期的使用是存储乌龟所在的关卡的 2d 表的块信息

function setUpLevel()
    local test = {_props = {}}
    local mt = {}

    local function coord2index(x, z)
        return ((x-1) * xMax) + z
    end

    mt.__index = function(s, k)
        if s._props[coord2index(k[1], k[2])] ~= nil then
            return s._props[coord2index(k[1], k[2])]
        end
    end

    mt.__newindex = function(s, k, v)
    s._props[coord2index(k[1], k[2])] = v
    end
    mt.__call = function (t, k)
        if type(k) == "table" then print "Table" end
    end

    setmetatable(test, mt)
    return test
    --test[{1,2}] = 5
end

function setupCube()
    local cube = {}
    cube[relY]=setUpLevel()
    return cube
end

Cube = setupCube()

function readCubeData(x,y,z)
    if (Cube[y]==nil) then
        return nil
    end
    -- debug
    return Cube[y][{x,z}]
end

function storeCubeData(x,y,z,data)
    if (readCubeData(x,y,z)==nil) then
        Cube[y]=setUpLevel()
    end

    Cube[y][{x,z}]=data
    data= readCubeData(x,y,z)
    print (x,",",y,",",z,":",readCubeData(x,y,z))
    sleep(.5)
end

输出示例:

storeCubeData() 的 print 语句将提供正确的输出(顺序不重要,只需将数据对应到 x、y、z 的值) Image showing the output from readCubeData() function when used within storeCubeData()

但是 start() 中的以下 print 语句:

function start()
    detectAndStore()
    print("=============")
    sleep(1)
    data= readCubeData(0,relY,1)
    print (0,",",relY,",",1,":",readCubeData(0,relY,1))
    sleep(.5)
    data= readCubeData(-1,relY,0)
    print (-1,",",relY,",",0,":",readCubeData(-1,relY,0))
    sleep(.5)
    data= readCubeData(0,y,-1)
    print (0,",",relY,",",-1,":",readCubeData(0,relY,-1))
    sleep(.5)
    data= readCubeData(1,y,0)
    print (1,",",relY,",",0,":",readCubeData(1,relY,0))
    sleep(.5)
end
start()

将会产生以下输出:Output from start() function, incorrect output, mismatch between x,y,z values and data which is supposed to be in it

这是非常不正确的,x、y、z 值指向的值不正确,而且表不应该在相同的 x、y、z 位置重复。我实在是无法弄清楚这个问题

点赞
用户6632736
用户6632736

错误出在 storeCubeData(x,y,z,data) 中的 if (readCubeData(x,y,z)==nil) then。每次你试图在其中存储新信息时,你都会覆盖整个“层级结构”。应该是 if (Cube [y] == nil) then。整个 if 语句可以进一步简化为 Cube [y] = Cube [y] or setUpLevel ()

另外,if s._props[coord2index(k[1], k[2])] ~= nil then 是不必要的;函数可以定义为局部变量;哈希函数 coord2index 会出现冲突(例如,如果 xMax == 10,则 coord2index (1, 5) == coord2index (2, -5)),因此要像 @Egor Skriptunoff 建议的那样替换它。

2020-12-03 11:49:58