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
相关产品推荐
相关产品推荐

