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

游戏按钮开发报错:尝试将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:45:47