Lua中按钮调用类成员函数的功能异常问题求助
Lua Love2D中按钮调用类成员函数的解决方案
问题原因
Lua里的冒号(:)是语法糖,wheat:buy()等价于wheat.buy(wheat)——冒号会自动把对象作为第一个参数(也就是函数里的self)传递。
- 直接传
wheat:buy时,实际传递的是wheat.buy这个函数,但按钮触发回调时不会自动传入wheat作为self,导致buy函数里的self为nil,访问self.lvl就会报错。 - 传
wheat:buy()时,会立即执行这个函数(启动时就调用了),而不是把函数本身传给按钮,所以点击按钮自然没反应。
解决方案
方法1:用闭包包装成员函数
直接用匿名函数把成员函数的调用包起来,这样按钮触发时会执行这个闭包,闭包里会正确传递self:
-- 创建按钮时传入闭包 buyButton = Button.new("circle", x_mid, y_mid, 100, 100, function() wheat:buy() end, nil, "Buy Wheat")
这种方法不需要修改你的Button类,适合快速解决问题。
方法2:修改Button类支持上下文参数
如果需要多次调用类成员函数,可以给Button类增加一个上下文参数,用来传递对象(self):
- 修改
Button.new的构造,新增一个context参数并保存:
function Button.new(shape, x, y, w, h, callback, context, text) local self = {} -- 其他初始化代码... self.callback = callback self.context = context -- 保存上下文对象 self.text = text return self end
- 修改按钮的点击触发逻辑,调用回调时传入上下文:
function Button:onClick() if self.callback then if self.context then -- 把上下文作为第一个参数传入,对应成员函数的self self.callback(self.context) else self.callback() end end end
- 创建按钮时,传递成员函数(用点号
wheat.buy)和对象本身:
buyButton = Button.new("circle", x_mid, y_mid, 100, 100, wheat.buy, wheat, "Buy Wheat")
这种方式更灵活,适合大量使用类成员函数作为回调的场景。
内容的提问来源于stack exchange,提问作者Sirin
相关产品推荐
相关产品推荐

