当调用storyboard:purge/removeScene时,“didRemoveListeners”(一个nil值)会出现。如何通过scene.view添加/删除DisplayObject?

我需要帮助我的小项目……

我有一个有两个场景的游戏(菜单和游戏),我无法正确更改场景。我的主要问题是我不能正确地删除所有场景.view DisplayObjects,因为storyboard.purgeScene("game")会生成以下错误:

“didRemoveListeners”(nil值)

这里是我的代码解释:

  • 在“菜单场景”中,我调用storyboard.goToScene("game")
  • 在“游戏”中的CreateScene中,我创建了我的DisplayObject并将它们插入到GroupViewscene.view)中
  • 在我的代码的更深层次中,我创建了各种物理学的DisplayObject球,并将它们通过stageGroupView:insert(ball)添加到scene.view

  _stageGroupView_是在“游戏”的CreateScene中分配的一个局部变量,该变量在模块的顶部声明,并分配给display.getCurrentStage()

  • 当我的冲突检测器内满足条件时,我调用goToScene("menu"),如果我理解得正确,这将执行我的“game”场景的exitScene监听器。
  • 在“exitScene”内,我删除所有监听器和计时器
  • 在“didExitScene”内,我已经试过淨化/删除场景,但是每次都会得到前面提到的运行时错误。

此时,如果我将didExitScene保留为空,则storyboard将完成其工作,但是游戏场景.view不会被擦除。我只想知道一种有效的方法将动态创建的DisplayObject添加到我的scene.view中,并且能够淨化/删除场景而不会有运行时错误

以下是我代码的一些部分,以便更好地理解:

local function addBall(ball)
     stageGroupView:insert(ball)
end

function scene:exitScene( event )
local group = self.view

timer.cancel( spawnTimer )
timer.cancel( gameTimer )

background:removeEventListener( "touch", onTouch )
player:removeEventListener( "touch", onTouch )
player:removeEventListener( "collision", onPlayerCollision )
bottomBorder:removeEventListener( "collision", onBottomBorderCollision )
rightBorder:removeEventListener( "collision", onRightBorderCollision )
end

function scene:didExitScene(event)

--local group = self.view
--group:removeSelf()
storyboard.purgeScene( "game" )

end

正如您所看到的,我甚至尝试了group:removeSelf()来擦除我的场景视图,但效果很差...一旦我退出并重新进入“game”场景,由“menu”goToScene(“game”)触发另一个运行时错误:

在函数'insert'中,将第-2个错误参数(代理)插入“(期望,得到nil):在menu.lua中的“goToScene”函数中的功能“insert”?

点赞
用户2653067
用户2653067

我请求你在调用游戏场景之前调用 storyboard.removeScene( MenuScene)。不要使用 purge scene,因为它不会释放全部内存。确保你所有的显示对象都已插入到 self.view 中。如果对于 purge sceneremove scene 有任何疑问,请参考此处 :http://coronalabs.com/blog/2012/07/31/storyboard-scene-purging-vs-removal/

2014-07-21 05:36:19