Lua 从表中获取数据
我使用生成了一个Lua文件,其中包含一个表。所以我想我应该写一个for循环,它在表中循环获取tile id并检查collision是否为true,如果为true则添加collision。但是,我一直无法获取瓷砖id或检查它们的属性。但它返回了一个错误,说我试图索引nil值tileData 这是地图文件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 = {
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的作者编写了一个教程,您可能会发现该教程对入门很有帮助: