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

Corona引擎报错:Attempt to perform arithmetic on field 'y' (a nil value) 求助

你的Corona引擎错误解析与解决办法

嘿,我来帮你捋捋这个问题哈!

首先,先拆解一下你遇到的错误:Attempt to perform arithmetic on field 'y' (a nil value),这句话的意思很明确——你尝试对background.y做加法运算,但此时background这个变量已经变成了空值(nil),自然找不到它的y属性,所以触发了错误。

错误的核心原因

你应该是在游戏结束(lives=0)的时候,调用了移除背景的代码(比如display.remove(background)或者background:removeSelf()),但这里有个关键问题:之前用来驱动背景移动的move函数,大概率是通过enterFrame事件或者定时器绑定在Runtime上持续运行的!

当你移除背景后,background对象被销毁了,但绑定的move函数并没有被停止,它还在不断执行background.y = background.y + 4这行代码——这时候background已经是nil了,访问它的y属性自然会报错。

解决办法

给你两个实用的解决思路:

  • 及时停止关联的事件/定时器
    如果move是通过enterFrame事件绑定的,在移除背景前一定要解绑这个事件:

    -- 移除背景前先解绑enterFrame事件
    Runtime:removeEventListener("enterFrame", move)
    -- 再移除背景
    display.remove(background)
    background = nil  -- 手动将变量置为nil,避免后续误访问
    

    如果是用定时器驱动的move,记得提前保存定时器ID,移除背景时取消定时器:

    -- 初始化时保存定时器ID
    local moveTimer = timer.performWithDelay(16, move, 0)
    -- 游戏结束时
    timer.cancel(moveTimer)  -- 取消定时器
    display.remove(background)
    background = nil
    
  • 在move函数里加安全判断
    可以在move函数开头加一个判断,先确认background对象是否存在,再执行移动逻辑:

    local function move()
        -- 先检查背景是否还存在,存在才执行移动
        if background then
            background.y = background.y + 4
        end
    end
    

    这样就算没及时停止函数,也不会触发错误,因为当background是nil时,会直接跳过移动代码。

内容的提问来源于stack exchange,提问作者MNOT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:29:46