Love2D(Lua)面向对象编程实现弹跳小球变色功能失效问题求助
问题排查与修复方案
核心问题1:实例方法调用错误
你在Ball:checkEdges函数中调用变色方法时,使用了Ball:changeColor()的写法。Lua中冒号声明的方法默认会将调用者作为self参数传入,这里你调用的是类原型Ball的方法,修改的是原型表的r/g/b属性,而非你创建的ball实例的属性。
补充说明:你看到控制台打印的颜色值正常更新,是因为打印的是被修改的原型属性值。但你创建ball实例时已经给实例自身设置了r/g/b属性,Lua读取属性时会优先读取实例自身的属性,不会用到原型上的修改后的值,所以渲染时一直用的是初始化的白色值。
修复方式:将Ball:checkEdges中的两处Ball:changeColor()替换为self:changeColor()。
核心问题2:Love2D颜色值范围不匹配
从Love2D 11.0版本开始,love.graphics.setColor的RGB参数取值范围从0-255调整为0-1的浮点数,你当前生成的0-255数值传入后,所有大于1的数值都会被截断为1,导致渲染颜色始终为白色。
修复方式:要么在生成随机颜色时直接生成0-1的浮点数,要么在调用love.graphics.setColor时将r/g/b值除以255。
修复后的关键代码片段
修正后的Ball:checkEdges方法
function Ball:checkEdges() if self.x + self.ballRadius > love.graphics.getWidth() or self.x - self.ballRadius < 0 then self.xSpeed = self.xSpeed * -1 self:changeColor() end if self.y + self.ballRadius> love.graphics.getHeight() or self.y - self.ballRadius < 0 then self.ySpeed = self.ySpeed * -1 self:changeColor() end end
修正后的Ball:changeColor方法(适配0-1颜色范围)
function Ball:changeColor() self.r = love.math.random() self.g = love.math.random() self.b = love.math.random() -- 如需打印0-255格式的色值调试,可乘以255输出 print('color: ' .. math.floor(self.r*255) .. ' ' .. math.floor(self.g*255) .. ' ' .. math.floor(self.b*255)) end
可选优化:规范实例方法调用(非必须,符合Lua面向对象写法习惯)
main.lua中的update和draw方法可以修改为更简洁的冒号调用形式:
function love.update(dt) ball:move() ball:checkEdges() end function love.draw() love.graphics.setBackgroundColor(0, 0, 0) ball:show() end
内容的提问来源于stack exchange,提问作者Kevin Tung
相关产品推荐
相关产品推荐

