Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 从表中获取数据_Lua_Datatables_Love2d_Tiled - Fatal编程技术网

Lua 从表中获取数据

Lua 从表中获取数据,lua,datatables,love2d,tiled,Lua,Datatables,Love2d,Tiled,我使用生成了一个Lua文件,其中包含一个表。所以我想我应该写一个for循环,它在表中循环获取tile id并检查collision是否为true,如果为true则添加collision。但是,我一直无法获取瓷砖id或检查它们的属性。但它返回了一个错误,说我试图索引nil值tileData 这是地图文件 return { version = "1.1", luaversion = "5.1", -- more misc. data tilesets = {

我使用生成了一个Lua文件,其中包含一个表。所以我想我应该写一个for循环,它在表中循环获取tile id并检查collision是否为true,如果为true则添加collision。但是,我一直无法获取瓷砖id或检查它们的属性。但它返回了一个错误,说我试图索引nil值tileData

这是地图文件

return {
    version = "1.1",
    luaversion = "5.1",
    -- more misc. data
    tilesets = {
      {
        name = "Tileset1",
            firstgid = 1,
            tilewidth = 16,
            tileheight = 16,
            tiles = {
              {
                id = 0,
                properties = {
                    ["Collision"] = false
                }
              },
            }
        }
    layers = {
      {
        type = "tilelayer",
        name = "Tile Layer 1"
        data = {
            -- array of tile id's
        }
      }
    }
  } 
这是我写的循环表的for循环

require("Protyping")
local map = love.filesystem.load("Protyping.lua")()
local tileset1 = map.tilesets
local tileData = tileset1.tiles
local colision_layer = map.layers[1].data

for y=1,16 do 
    for x=1,16 do
        if tileData[colision_layer[x*y]].properties["Colision"] == true then
            world:add("collider "..x*y,x*map.tilewidth, y*tileheight,tilewidth,tileheight)
        end
    end
end
试试这个:

tileset1 = map.tilesets[1]
而不是

tileset1 = map.tilesets
map.tilesets[1]
而不是
map.tilesets
)修复了您遇到的错误,但至少还有两件事需要修复,代码才能正常工作

第一个是一致的拼写:地图数据中有一个
Collision
属性,代码中有一个
Colision
检查

您需要修复的第二件事是引用各个分幅的方式。平铺的图层数据由二维平铺数据组成,从左到右以一维数组排列,从顶部开始,因此索引号如下所示:

你可能会认为你可以做
x*y
来获取索引,但是如果你仔细观察,你会发现这是行不通的。相反,您必须执行宽度
x+(y-1)*

或者,如果使用基于零的x和y,则如下所示:

就我个人而言,我更喜欢基于0的x和y(但随着我对Lua越来越熟悉,这可能会改变,因为Lua有基于1的阵列)。如果使用基于0的x和y,则公式为
x+1+y*width

我今天早上刚刚写了一篇教程,介绍了平铺格式,并且有一些辅助函数可以做到这一点(使用基于0的公式)。您可能会发现它很有用:


本教程使用,这是一个非常好的库,用于处理平铺lua文件。由于您试图进行碰撞,我应该提到STI有一个用于凹凸碰撞库和box2d(物理)碰撞库的插件。

谢谢,代码运行了,我只需要修复for循环,以便它将碰撞放置在正确的位置,但如果可行,则除此之外。if
tileData[colision_layer[x*y].properties[“结肠炎”]
只接受
true
false
值,那么您不需要
==true
。还要注意的是
nil
被视为与
false
相同,任何值都被视为
true
。感谢您的建议,if语句每次运行时都返回false。我想这是因为我引用错误避免冲突。感谢您的详细回复。我将查看简单平铺实现,看看是否可以实现。BSB:STI的作者编写了一个教程,您可能会发现该教程对入门很有帮助: