先上一个场景的基本模版:
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 end 15 16 function ModelScene:onTouch( event, x, y ) 17 if event == "began" then 18 return true 19 elseif event == "moved" then 20 return true 21 elseif event == "ended" then 22 23 end 24 end 25 26 function ModelScene:onEnter() 27 28 -- 框架结构 29 self.layer:setTouchEnabled(true) 30 31 if device.platform == "android" then 32 -- avoid unmeant back 33 self:performWithDelay(function() 34 -- keypad layer, for android 35 local layer = display.newLayer() 36 layer:addKeypadEventListener(function(event) 37 if event == "back" then app.exit() end 38 end) 39 self:addChild(layer) 40 41 layer:setKeypadEnabled(true) 42 end, 0.5) 43 end 44 end 45 46 function ModelScene:onExit() 47 self.sceneName = nil 48 end 49 50 function ModelScene:onCleanup() 51 52 end 53 54 function ModelScene:onExitTransitionStart() 55 56 end 57 58 function ModelScene:onEnterTransitionFinish() 59 60 end 61 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++的调用转换函数。
quick cocos2d x场景切换的生命周期函数调用学习
时间: 2024-10-05 04:22:54