从表中获取数据

时间:2017-01-31 22:04:52

标签: lua datatables love2d tiled

使用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

2 个答案:

答案 0 :(得分:2)

试试这个:

rdb

而不是

tileset1 = map.tilesets[1]

答案 1 :(得分:1)

lhf's answermap.tilesets[1]而非map.tilesets)修复了您所获得的错误,但至少还有两件事需要修复才能使代码正常工作。< / p>

首先是一致的拼写:您的地图数据中包含Collision属性,并且代码中包含Colision

您需要解决的第二件事是引用各个图块的方式。 Tiled的图层数据由从左到右的一维数组布局的二维图块数据组成,从顶部开始,因此索引编号如下所示:

tiled indexes

你会认为你可以x * y来获取索引,但仔细观察,你会发现这不起作用。相反,您必须执行x + (y - 1) * width

或者,如果您使用从零开始的x和y,它看起来像这样:

tiled indexes 0-based

就个人而言,我更喜欢基于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(物理)碰撞库。