【问题标题】:Corona SDK Error: physics.start() has not been calledCorona SDK 错误:physics.start() 尚未被调用
【发布时间】:2014-08-04 06:26:27
【问题描述】:

我的 main.lua 将我指向第一级,我有一个 onCollision 函数将我带到第二级,但是当我进入第二级时,除了物理引擎之外,一切都加载正常。我在控制台中收到错误消息 ERROR: physical.start() has not been called。但是在 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,但我仍然得到相同的结果。

【问题讨论】:

  • 将physics.start() 移动到您的场景中:create(event) 函数。
  • 我试过了,还是不行,还是一样的错误信息。
  • 可能有很多东西。也许是一个使用物理模块的听众,您没有正确关闭/从旧场景中删除?这样,当您在另一个场景中移除物理时,侦听器可能会在您没有启用物理时触发错误。但如前所述,错误可能出现在很多地方,无法在提供的代码中找到任何内容。
  • 谢谢,我意识到我有一个未删除的事件监听器。我仍然收到错误,但一切正常。

标签: lua coronasdk physics-engine


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我的场景中有一个碰撞监听器:创建函数。

        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
    

    我仍然收到与以前相同的错误消息,但问题似乎已解决。我知道这不会对每个人都适用,但它对我有用,希望它对与我有同样问题的其他人有用。

    感谢冰雪奇缘对我的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 2012-05-08
      • 1970-01-01
      • 2017-07-26
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多