使用Tiled我生成了一个包含表格的Lua文件。所以我想我会写一个for循环,循环通过表获取tile id并检查是否为true,如果是则添加碰撞。但是,我一直无法得到瓷砖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
答案 0 :(得分:2)
试试这个:
rdb
而不是
tileset1 = map.tilesets[1]
答案 1 :(得分:1)
lhf's answer(map.tilesets[1]
而非map.tilesets
)修复了您所获得的错误,但至少还有两件事需要修复才能使代码正常工作。< / p>
首先是一致的拼写:您的地图数据中包含Collision
属性,并且代码中包含Colision
。
您需要解决的第二件事是引用各个图块的方式。 Tiled的图层数据由从左到右的一维数组布局的二维图块数据组成,从顶部开始,因此索引编号如下所示:
你会认为你可以x * y
来获取索引,但仔细观察,你会发现这不起作用。相反,您必须执行x + (y - 1) * width
。
或者,如果您使用从零开始的x和y,它看起来像这样:
就个人而言,我更喜欢基于0的x和y(但随着我对Lua的熟悉,这可能会改变,因为Lua有基于1的数组)。如果您使用基于0的x和y,则公式为x + 1 + y * width
。
我恰好今天早上刚刚编写了一个教程,它覆盖了Tiled格式,并且有一些辅助函数可以完成这个(使用基于0的公式)。您可能会觉得有用:https://github.com/prust/sti-pg-example。
本教程使用Simple Tiled Implementation,这是一个非常好的库,用于处理Tiled lua文件。由于您正在尝试进行碰撞,我应该提到STI有一个插件用于碰撞碰撞库和box2d(物理)碰撞库。