cocos2d-x-LuaProxy学习日志(7) -- 场景切换

来源:互联网 发布:淘宝优惠券查询机器人 编辑:程序博客网 时间:2024/06/04 19:25

一、切换效果简介


       cocos2d_x提供了大量的场景切换效果、你无需自己再去实现、基本已经能满足日常开发的要求了、游戏中的第一个场景、使用pDirector:runWithScene(Scene)即可以出现相应场景、如要切换场景、则使用CCDirector:sharedDirector():replaceScene(Scene)就可替换为新场景、如要实现不太单调的切换效果则需要实现相应的切换的方法生成相应场景然后再通过CCDirector:sharedDirector():replaceScene(Scene)来启动场景、场景过渡不会太难看,若想深入了解,可参考coco2d-x 2.1.4 luaTest项目中场景切换样例。

       这里不详细说明,我实现思路如图:




二、实现:


1.主场景:


      主场景UI:





代码如下:

      场景:controller.lua

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. require "hello"  
  2. ----------------  
  3.   
  4. -- run  
  5. local scene = CCScene:create()  
  6. scene:addChild(createTest())  
      层:hello.lua

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. -- for CCLuaEngine traceback  
  2. require "hello1"  
  3. require "hello2"  
  4.   
  5. -- avoid memory leak  
  6. collectgarbage("setpause", 100)  
  7. collectgarbage("setstepmul", 5000)  
  8.   
  9. local cclog = function(...)  
  10. print(string.format(...))  
  11. end  
  12.   
  13. local _allTests = {  
  14.     { isSupported = true , name = "hello1" , create_func = AccelerometerMain} ,  
  15.     { isSupported = true , name = "hello2" , create_func = AccelerometerMain1}  
  16. }  
  17.   
  18. --create scene  
  19. local  function CreateTestScene( nIdx )  
  20.     --print("*******************",_allTests[0].create_func());  
  21.     local  scene = _allTests[nIdx].create_func()  
  22.     CCDirector:sharedDirector():purgeCachedData()  
  23.     return scene  
  24. end  
  25. -----------------  
  26.   
  27. function createTest()  
  28.     local TestLayer = CCLayer:create()  
  29.     local proxy = LuaProxy:create()  
  30.     proxy:retain() -- hold the proxy, while the button gone, release the proxy.  
  31.     local n = proxy:readCCBFromFile("ccbResources/ccb/Test.ccbi") -- Got a CCNode  
  32.     local l = tolua.cast(n, "CCLayer") -- Cast the node into CCLayer  
  33.   
  34.     TestLayer:addChild(l)  
  35.           
  36.     --跳转界面1  
  37.     local menuItemTest = proxy:getNode"menuTest","CCMenuItem"  
  38.     proxy:handleMenuEvent(menuItemTest,function()  
  39.         CCLuaLog("menuTest");  
  40.      -- do something          
  41.             local  testscene = CreateTestScene(1)  
  42.             if testscene then  
  43.                 CCDirector:sharedDirector():replaceScene(CCTransitionFadeBL:create(1, testscene))  
  44.             end  
  45.     end)  
  46.   
  47.     --跳转界面2  
  48.     local menuItemTest = proxy:getNode"menuTest1","CCMenuItem"  
  49.     proxy:handleMenuEvent(menuItemTest,function()  
  50.         CCLuaLog("menuTest1");  
  51.      -- do something          
  52.             local  testscene = CreateTestScene(2)  
  53.             if testscene then  
  54.                 CCDirector:sharedDirector():setDepthTest(true)  
  55.                 CCDirector:sharedDirector():replaceScene(CCTransitionPageTurn:create(2, testscene, false))  
  56.             end  
  57.     end)  
  58.   
  59.     --退出游戏  
  60.     local menuItemTest = proxy:getNode"endBtn","CCMenuItem"  
  61.     proxy:handleMenuEvent(menuItemTest,function()  
  62.         CCLuaLog("proxy:endToLua");  
  63.          CCDirector:sharedDirector():endToLua()  
  64.     end)  
  65.   
  66.     return TestLayer  
  67. end  

2.场景1:


      场景1UI:




场景1:hello1.lua,代码如下:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. local function AccelerometerMainLayer()  
  2.     local pLayer = CCLayer:create()  
  3.     local proxy = LuaProxy:create()  
  4.         proxy:retain() -- hold the proxy, while the button gone, release the proxy.  
  5.     local n = proxy:readCCBFromFile("ccbResources/ccb/Test1.ccbi") -- Got a CCNode  
  6.     local l = tolua.cast(n, "CCLayer") -- Cast the node into CCLayer  
  7.     pLayer:addChild(l)  
  8.   
  9.     local menuItemTest = proxy:getNode"comeBack","CCMenuItem"  
  10.     proxy:handleMenuEvent(menuItemTest,function()  
  11.         CCLuaLog("comeBack");  
  12.      -- do something          
  13.          local scene = CCScene:create()  
  14.          scene:addChild(createTest())  
  15.          CCDirector:sharedDirector():replaceScene(CCTransitionFadeTR:create(1, scene))  
  16.     end)  
  17.   
  18.     return pLayer  
  19. end  
  20.   
  21.   
  22. function AccelerometerMain()  
  23.     --cclog("AccelerometerMain")  
  24.     local scene = CCScene:create()  
  25.     scene:addChild(AccelerometerMainLayer())  
  26.     return scene  
  27. end  

3.场景2:


      场景2UI:




场景2:hello2.lua,代码如下:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. local function AccelerometerMainLayer1()  
  2.     local pLayer = CCLayer:create()  
  3.     local proxy = LuaProxy:create()  
  4.         proxy:retain() -- hold the proxy, while the button gone, release the proxy.  
  5.     local n = proxy:readCCBFromFile("ccbResources/ccb/Test2.ccbi") -- Got a CCNode  
  6.     local l = tolua.cast(n, "CCLayer") -- Cast the node into CCLayer  
  7.     pLayer:addChild(l)  
  8.   
  9.   
  10.     local menuItemTest = proxy:getNode"comeBack","CCMenuItem"  
  11.     proxy:handleMenuEvent(menuItemTest,function()  
  12.         CCLuaLog("comeBack");  
  13.      -- do something          
  14.          local scene = CCScene:create()  
  15.          scene:addChild(createTest())  
  16.          CCDirector:sharedDirector():setDepthTest(true)  
  17.   
  18.          CCDirector:sharedDirector():replaceScene( CCTransitionPageTurn:create(1, scene, true))  
  19.     end)  
  20.   
  21.   
  22.     return pLayer  
  23. end  
  24.   
  25.   
  26. function AccelerometerMain1()  
  27.     --cclog("AccelerometerMain")  
  28.     local scene = CCScene:create()  
  29.     scene:addChild(AccelerometerMainLayer1())  
  30.     return scene  
  31. end  

只要点击相应菜单,即可跳转。若感觉切换效果不好,可更换其它效果。

提供效果:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. --原场景先缩小跳跃出、新场景跳跃进    
  2. CCTransitionJumpZoom:transitionWithDuration(t, s)  
  3. --原场景淡出、新场景淡入、第三参数为淡出淡入颜色、省去的时候默认为黑色  
  4. CCTransitionFade:transitionWithDuration(t, s, ccWHITE)  
  5. --淡出淡入交叉、同时进行  
  6. CCTransitionCrossFade:transitionWithDuration(t,s)  
  7. --新场景从各方面移入覆盖原场景(效果不错)  
  8. CCTransitionMoveInL:transitionWithDuration(t, s)  
  9. CCTransitionMoveInR:transitionWithDuration(t, s)  
  10. CCTransitionMoveInT:transitionWithDuration(t, s)  
  11. CCTransitionMoveInB:transitionWithDuration(t, s)  
  12. --新场景从各方向移入将原场景推出屏幕(个人感觉这个效果不太好)  
  13. CCTransitionSlideInL:transitionWithDuration(t, s)  
  14. CCTransitionSlideInR:transitionWithDuration(t, s)  
  15. CCTransitionSlideInT:transitionWithDuration(t, s)  
  16. CCTransitionSlideInB:transitionWithDuration(t, s)  
  17. --波浪、百叶窗、随机小方块  
  18. CCTransitionFadeTR:transitionWithDuration(t, s)  
  19. CCTransitionFadeBL:transitionWithDuration(t, s)  
  20. CCTransitionFadeUp:transitionWithDuration(t, s)  
  21. CCTransitionFadeDown:transitionWithDuration(t, s)  
  22. CCTransitionTurnOffTiles:transitionWithDuration(t, s)  
  23. --按行按列来切  
  24. CCTransitionSplitRows:transitionWithDuration(t, s)  
  25. CCTransitionSplitCols:transitionWithDuration(t, s)  
  26. --顺时逆时切入  
  27. CCTransitionRadialCCW:transitionWithDuration(t,s)  
  28. CCTransitionRadialCW:transitionWithDuration(t,s)  
  29. --分别是x轴左右翻和y轴上下翻、参数分别是0和1、感觉翻的效果都不太好  
  30. --在c++项目中测试没问题、lua中这几个有带翻效果的函数都会出现花屏现象、原因未知  
  31. --有知道的同学请留言告知、不甚感激  
  32. CCTransitionFlipX:transitionWithDuration(t, s, 0)  
  33. CCTransitionFlipY:transitionWithDuration(t, s, 0)  
  34. --有角度转的翻  
  35. CCTransitionFlipAngular:transitionWithDuration(t, s, 0)  
  36. --带缩放效果x轴翻  
  37. CCTransitionZoomFlipX:transitionWithDuration(t, s, 0)  
  38. --带缩放效果y轴翻  
  39. CCTransitionZoomFlipY:transitionWithDuration(t, s, 0)  
  40. --带缩放效果/有角度转的翻  
  41. CCTransitionZoomFlipAngular:transitionWithDuration(t, s, 0)  
  42. --交错换 原场景逐渐变小 新场景逐渐变大  
  43. CCTransitionShrinkGrow:transitionWithDuration(t, s);  
  44. --转角换  换角度  
  45. CCTransitionRotoZoom:transitionWithDuration(t, s);  
  46. --前后翻页、个人感觉效果不佳  
  47. CCTransitionPageTurn:transitionWithDuration(t, s, false)  
  48. CCTransitionPageTurn:transitionWithDuration(t, s, true)  


我只是列举一部分,具体效果大家还是看引擎中的tests吧

这里只是一个简单场景跳转实例,若做整个项目开发时候,最好使用事件机制(监听),实现场景之间跳转管理。余留的问题就由网友们思考吧~~~

呵呵,到这里,整篇博文就结束了。


转载请注明出处:http://blog.csdn.net/rexuefengye/article/details/16855971


原创粉丝点击