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

Lua+LOVE2D数组中调用draw_self方法报错:nil值异常

问题原因与解决办法

核心问题

你创建的TextBox实例没有继承TextBox表中的方法,导致调用draw_self时找不到该方法,触发attempt to call method 'draw_self' (a nil value)错误。

修正步骤

1. 修复init方法,让实例继承原型属性和方法

Lua中实现类的实例化,需要通过**元表(metatable)**让实例继承原型的方法和属性。修改后的init方法如下:

TextBox = {
    x = 0,
    y = 0,
    width = 256,
    height = 64,
    text = '',
    active = false,
    colors = {
        background = { 186, 163, 182, 220 },
        text = { 20, 20, 20, 255 },
        border = { 48, 44, 50, 230 },
        activeborder = { 236, 234, 115, 240 }
    }
}

function TextBox:init(x, y)
    local o = {}
    -- 设置元表,让实例o继承TextBox的所有属性和方法
    setmetatable(o, {__index = self})
    o.x = x
    o.y = y
    return o
end

注:原代码中"x": 0这种JSON式写法Lua虽兼容,但更标准的写法是x = 0,建议统一修改。

2. 修复draw_self方法中的错误

原draw_self直接引用全局的textBoxArray[i]会导致所有实例共用同一坐标,正确做法是用self指代当前实例:

function TextBox:draw_self()
    -- 绘制背景
    love.graphics.setColor(unpack(self.colors.background))
    love.graphics.rectangle('fill', self.x, self.y, self.width, self.height)
    
    -- 根据激活状态切换边框颜色
    if self.active then
        love.graphics.setColor(unpack(self.colors.activeborder))
    else
        love.graphics.setColor(unpack(self.colors.border))
    end
    love.graphics.rectangle('line', self.x, self.y, self.width, self.height)
    
    -- 绘制输入文本
    love.graphics.setColor(unpack(self.colors.text))
    love.graphics.print(self.text, self.x + 8, self.y + 8)
end

3. 调整实例创建代码

原init调用时的多余nil参数可以去掉,直接传入坐标即可:

function love.load()    
    textBoxArray = {}
    for i=1,4 do
        local xx = (i-1) * 270 -- 示例间距,可根据需求调整
        local yy = 0
        textBoxArray[i] = TextBox:init(40+xx, 40+yy)
    end
end

4. 确认love.draw调用逻辑

原循环逻辑无误,实例修正后即可正常调用:

function love.draw()
    for i=1,4 do
        textBoxArray[i]:draw_self()
    end    
end

额外说明

Lua的面向对象基于表和元表实现,:init这种冒号定义的方法会自动将调用者作为第一个参数(即self),因此用TextBox:init(x,y)等价于TextBox.init(TextBox, x,y),确保init里的self指向原型表。

内容的提问来源于stack exchange,提问作者Capnsockless

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:25:54