游戏按钮开发报错:尝试将nil与数字比较问题求助
问题原因与修复方案
报错根源
你遇到的“尝试将nil与数字进行比较”错误,核心问题有两个:
- 变量未初始化就使用:你把触摸坐标的判断逻辑
if inputX <= rectX and inputY <= rectY写在了全局作用域,程序启动时就会执行这段代码,但此时onTick函数还没运行,inputX和inputY都是未赋值的nil,自然触发类型错误。 - 代码结构混乱:你在
else块里直接嵌套了onDraw函数,导致这个绘制函数只有在判断不成立时才会被定义,逻辑彻底混乱;同时点击判断的逻辑也不对——要判断触摸点是否在矩形内,应该检查坐标是否落在矩形的x轴(rectX ≤ inputX ≤ rectX+rectW)和y轴(rectY ≤ inputY ≤ rectY+rectH)范围内,而不是单纯小于等于矩形的起始坐标。
修正后的代码
rectX = 1 rectY = 1 rectW = 10 rectH = 10 isPressingRectangle = false -- 提前初始化状态变量 function onTick() local isPressed = input.getBool(1) local inputX = input.getNumber(3) local inputY = input.getNumber(4) -- 正确判断触摸点是否在矩形范围内 if isPressed and inputX >= rectX and inputX <= rectX + rectW and inputY >= rectY and inputY <= rectY + rectH then isPressingRectangle = true else isPressingRectangle = false end output.setBool(1, isPressingRectangle) end function onDraw() -- 根据触摸状态绘制对应矩形 if isPressingRectangle then screen.drawRectF(rectX, rectY, rectW, rectH) else screen.drawRect(rectX, rectY, rectW, rectH) end -- 绘制触摸坐标(转成字符串避免类型问题) screen.drawText(16, 16, tostring(inputX)) screen.drawText(35, 16, tostring(inputY)) end
关键改动说明
- 将触摸判断逻辑移到
onTick内部,确保每次tick都能拿到最新的inputX和inputY后再进行比较,彻底避免nil值问题。 - 修正了矩形点击的判断逻辑,同时加入
isPressed的判断,确保只有触摸按下时才触发状态变化。 - 把
onDraw函数放在全局作用域,保证程序启动时就被正确定义,每次绘制周期都能执行。 - 初始化
isPressingRectangle变量,避免未定义的潜在问题。 - 使用
local关键字声明局部变量,减少全局变量污染。
内容的提问来源于stack exchange,提问作者Rhys Smith
相关产品推荐
相关产品推荐

