首页 > 代码库 > quick cocos2d x场景切换的生命周期函数调用学习

quick cocos2d x场景切换的生命周期函数调用学习

先上一个场景的基本模版:

 1 local ModelScene = class("ModelScene", function() 2     return display.newScene("ModelScene") 3 end) 4  5 function ModelScene:ctor() 6      self.sceneName = "ModelScene" 7     -- 注册点击事件监听 8     self.layer = display.newLayer() 9     self.layer:addTouchEventListener(function(event, x, y)10         return self:onTouch(event, x, y)11     end)12     self:addChild(self.layer)13     14 end15 16 function ModelScene:onTouch( event, x, y )17     if event == "began" then18         return true19     elseif event == "moved" then20         return true21     elseif event == "ended" then22         23     end24 end25 26 function ModelScene:onEnter()27 28     -- 框架结构29     self.layer:setTouchEnabled(true)30 31     if device.platform == "android" then32         -- avoid unmeant back33         self:performWithDelay(function()34             -- keypad layer, for android35             local layer = display.newLayer()36             layer:addKeypadEventListener(function(event)37                 if event == "back" then app.exit() end38             end)39             self:addChild(layer)40 41             layer:setKeypadEnabled(true)42         end, 0.5)43     end44 end45 46 function ModelScene:onExit()47     self.sceneName = nil48 end49 50 function ModelScene:onCleanup()51     52 end53 54 function ModelScene:onExitTransitionStart()55     56 end57 58 function ModelScene:onEnterTransitionFinish()59 60 end61 62 63 return ModelScene

依据这个模版,写了一个测试模型。两个场景的切换:(PuzzleScene && DemoScene)

在生命周期函数中添加语句打印。控制台输出结果。

1)首先进入的是PuzzleScene,点击跳转到DemoScene,执行语句:

PuzzleScene执行的顺序是:onExitTransitionStart -> onExit -> onCleanup

DemoScene执行的顺序是:ctor -> onEnter -> onEnterTransitionFinish

2)再从DemoScene进入PuzzleScene,执行语句如下:

对比可知:正好和上面的情况反过来了。

场景退出时,需要注意的是最后调用的函数是cleanup。

知道了这五个生命函数和一个构造函数在场景切换的顺序后,就可以在程序中恰当的进行资源释放等操作。

至于为什么这么个执行顺序,需要先看quick库的这个代码:

通过self:registerScriptHandler(handler)注册了回调监听函数。这样在场景切换的时候就可以按照回调函数传回来的event,来执行相应的生命周期函数了。

Lua注册监听函数后,其实真正的场景切换执行者还是C++代码。所以~~~Lua更像是一个层,附在了C++的躯体上,

通过tolua++工具,生成中间的lua到c++的调用转换函数。