我在使用与碰撞检测和故事板库相关的Corona SDK时遇到了一个奇怪的错误. 这是我的onCollision监听器: local function onBottomBorderCollision( event ) if (event.other.isBall) then local index = table.indexOf( ba
这是我的onCollision监听器:
local function onBottomBorderCollision( event ) if (event.other.isBall) then local index = table.indexOf( ballArray, other ) table.remove( ballArray, index ) event.other:removeSelf( ) event.other = nil updateLife(false) updateScore(false) end end
这在第一次启动时工作正常,但在返回菜单屏幕(使用storyboard.goToScene(“menu”))并重放游戏后,现在每次我的一个球击中底部边框时,此侦听器将触发以下错误:
attempt to index field “other”(a nil value)
我确实在场景中创建了正确的侦听器:onEnterScene(场景)所以它与它们无关,而且这个其他侦听器永远不会生成错误:
local function onPlayerCollision( event ) if(event.other.isBall) then xVel, yVel = event.other:getLinearVelocity( ) event.other:setLinearVelocity( event.other.XLinearVelocity, yVel ) end end
我现在被困住了……请帮忙!
实际上,这种类型的错误主要是由于一些活动的函数调用/定时器/转换引起的,在更改场景之前尚未取消.attempt to index field "other"(a nil value)
上述错误提到正在调用/获取任何对象/它的属性,但它不在当前事件或场景中.因此,请检查您是否取消了计时器,转换和运行时事件侦听器.
在您的情况下,可能是由于在运行时未能取消onBottomBorderCollision上的碰撞检测功能.如果您在enterFrame中调用它,则必须在场景更改之前取消它.你可以这样做:
Runtime:removeEventListener("enterFrame",onBottomBorderCollision)
更新:在碰撞检查运行时,您无法停止物理引擎.所以做如下:
function actualSceneChange() physics.stop() -- stop physics here -- call scene chage director:changeScene("menuPageName") -- call your scene change method end function initiatingSceneChange() physics.pause() -- pause physics here -- stop unwanted event listeners Runtime:removeEventListener("enterFrame",onBottomBorderCollision) if(timer_1)then timer.cancel(timer_1) end -- stop all your timers like this. if(trans_1)then transition.cancel(trans) end -- stop all your transitions like this. timer.performWithDelay(1000,actualSceneChange,1) end