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
相关产品推荐
相关产品推荐

