You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:51:42