Corona SDK错误:尚未调用physics.start()

时间:2014-07-22 02:26:09

标签: lua corona physics-engine

我的main.lua指向一级,我有一个onCollision函数,它将我带到二级,但是当我进入二级时,除了物理引擎外,一切都很好。我在控制台中收到错误,说ERROR:physics.start()尚未被调用。但是在level2.lua的顶部我宣布:

local physics = require( "physics" )
physics.start()

这是我的level1.lua文件的结尾:

function scene:hide( event )
    local sceneGroup = self.view
    local phase = event.phase
    if event.phase == "will" then
        -- Called when the scene is on screen and is about to move off screen
        physics.stop()
    elseif phase == "did" then
        -- Called when the scene is now off screen
    end
end
function scene:destroy( event )
    -- Called prior to the removal of scene's "view" (sceneGroup)
    local sceneGroup = self.view
    package.loaded[physics] = nil
    physics = nil
end

我的level2.lua的开头就是:

-----------------------------------------------------------------------------------           
--
-- level2.lua
--
---------------------------------------------------------------------------------------

local composer = require( "composer" )
local scene = composer.newScene()

-- include Corona's "physics" library
local physics = require ("physics")
physics.start()

-- forward declarations and other locals
local screenW, screenH, halfW, halfH = display.contentWidth, display.contentHeight,     display.contentWidth*0.5, display.contentHeight*0.5
local centerY, centerX = display.contentCenterY, display.contentCenterX

为什么我得到这个错误,即使我已经非常清楚地开始了物理学?我已经尝试将完全相同的代码从level1.lua复制到level2.lua但我仍然得到相同的结果。

2 个答案:

答案 0 :(得分:2)

您希望在主块中运行的代码只会在模块第一次加载时执行。如果您稍后重新进入场景并且没有取消场景。

您需要在scene:create()中执行physics.start()以允许您在其中添加Bodies。但是你不希望它们开始交互,直到加载场景。我在scene:create()中调用physics.start()然后立即用physics.pause()暂停它。然后在我的场景中:show()做了阶段,我再次调用physics.start()开始我的交互。这样你就可以重新进入场景,而不必重新创建它并开始你的物理学。

答案 1 :(得分:1)

我的场景中有一个碰撞监听器:create function。

    function onCollision( event )
    if(event.object1.myName == "name" and event.object2.myName == "name" ) then
        timer.performWithDelay( 3000, nextLevel, 1 )
        return true
    end
end

我认为这个函数一直在调用物理包,并在我进入下一个级别时返回错误,因为我调用了

physics.stop()

我设法通过删除函数第4行中的事件监听器来修复它:

    function onCollision( event )
    if(event.object1.myName == "ball" and event.object2.myName == "finThree" ) then
        timer.performWithDelay( 3000, nextLevel, 1 )
                Runtime:removeEventListener( "collision", onCollision ) -- I remove the eventListener here.
        return true
    end
end

我仍然得到与以前相同的错误消息,但问题似乎已修复。我知道这对每个人来说都不是一个解决方案,但它对我有用,并希望它对那些遇到与我同样问题的人有用。

感谢Frozire帮助我。