Love2D结合Tiled绘制地图报Quad expected, got nil错误如何解决
问题根因
报错tiledmap.lua:33: bad argument #2 to 'draw' (Quad expected, got nil)触发逻辑非常明确:
- Tiled导出的Lua格式地图中,每个图块集都带有
firstgid字段,代表该图块集内的图块在全局地图数据中的起始ID。你当前使用的chessboard地图里,图块集greenfeed的firstgid=3,意味着地图图层data里存储的图块ID3对应图块集第1个图块、ID4对应图块集第2个图块。 - 现有代码生成quad存储到
map.quads时,默认从数组索引1开始顺序插入,也就是map.quads[1]存第一个图块、map.quads[2]存第二个图块。渲染时直接拿图层里取到的tid(3、4)当索引查quads表,拿到的必然是nil值,传入draw函数就触发类型错误。 - 额外隐患:当前地图的
renderorder配置为left-up,即从地图左下角向右上角逐行渲染,现有代码y轴从0(顶部)开始遍历,会导致图块渲染顺序颠倒。
修复步骤
- 调整quad存储逻辑,匹配Tiled的firstgid规则,不再用
table.insert顺序追加,直接按Tiled的全局ID作为索引存储quad - 调整y轴遍历顺序,适配left-up渲染规则,从地图最底部行开始向上遍历绘制
- 增加quad非空判断,避免后续新增图块时触发同类报错
修复后完整tiledmap.lua代码
function loadTiledMap(path) local map = require(path) map.quads = {} local greenfeed = map.tilesets[1] map.greenfeed = greenfeed map.image = love.graphics.newImage(greenfeed.image) for y = 0, (greenfeed.imageheight / greenfeed.tileheight) - 1 do for x = 0, (greenfeed.imagewidth / greenfeed.tilewidth) - 1 do local quad = love.graphics.newQuad( x * greenfeed.tilewidth, y * greenfeed.tileheight, greenfeed.tilewidth, greenfeed.tileheight, greenfeed.imagewidth, greenfeed.imageheight ) -- 按Tiled全局图块ID存储quad,匹配firstgid偏移 local globalTid = greenfeed.firstgid + y * greenfeed.columns + x map.quads[globalTid] = quad end end function map:draw() for i, layers in ipairs(self.layers) do -- 适配left-up渲染顺序:从最底部行向上遍历 for y = layers.height - 1, 0, -1 do for x = 0, layers.width - 1 do local index = (x + y * layers.width) + 1 local tid = layers.data[index] if tid ~= 0 then local quad = self.quads[tid] if quad then local xx = x * self.greenfeed.tilewidth local yy = y * self.greenfeed.tileheight love.graphics.draw( self.image, quad, xx, yy ) end end end end end end return map end
同类问题通用排查思路
后续遇到Tiled+Love2D的Quad为nil错误,按以下顺序排查即可:
- 打印图层取出的tid值,确认是否和quads表的索引范围匹配
- 检查是否处理了图块集的firstgid偏移,多图块集场景下要先判断tid属于哪个图块集的ID范围,再做偏移计算
- 检查图块集的spacing、margin参数,如果Tiled里配置了图块间距、边距,生成quad时要把这部分偏移算进去,否则也会出现索引错位
- 确认Tiled导出地图时没有开启压缩、base64编码,否则layers.data不是纯Lua数组,解析逻辑要对应调整
内容的提问来源于stack exchange,提问作者Cinnamin Wolf
相关产品推荐
相关产品推荐

