cocos2d-x游戏开发(十一)细说场景切换

来源:互联网 发布:蓝牙测距编程 编辑:程序博客网 时间:2024/06/05 23:48

欢迎转载:http://blog.csdn.net/fylz1125/article/details/8533970


吐槽一下,刚写了一个小时,这CSDN不知抽什么风就是发不了,我以为存草稿了就刷新了一下,结果没存草稿。擦...

cocos2d-x引擎实现的场景切换特效有41个,我这里就不列举了。有兴趣的童鞋自行看源码或谷歌之,一大把介绍的。昨天看了红孩儿的场景切换,写的很详细,代码逐行注释。我这里不想详细解释代码,只侧重流程。


cocos2d-x里面的场景,分为两类

1.普通场景,就是CCScene::create()出来的。这类没有特效,运行的话直接就出来了。

2.过渡场景,就是有特效的场景,我称之为过渡场景。这类场景切换的时候有特效。


刚写了一遍,实在懒的详细写了。直接说结论:

所谓的过渡场景,就是将你create出来的场景包装了一下,比如

[cpp] view plaincopyprint?
  1. CCScene *scene = About::scene();  
  2. CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.2, scene));  

而所谓的特效,实质上就是实现了CCScene的onEnter()系列函数。

就CCTransitionFade为例子看下:

[cpp] view plaincopyprint?
  1. class CC_DLL CCTransitionFade : public CCTransitionScene  
  2. {  
  3. protected:  
  4.     ccColor4B    m_tColor;  
  5.   
  6. public:  
  7.   
  8.     CCTransitionFade();  
  9.     virtual ~CCTransitionFade();  
  10.       
  11.     /** creates the transition with a duration and with an RGB color 
  12.     * Example: FadeTransition::create(2, scene, ccc3(255,0,0); // red color 
  13.     */  
  14.     static CCTransitionFade* create(float duration,CCScene* scene, const ccColor3B& color);  
  15.     static CCTransitionFade* create(float duration,CCScene* scene);  
  16.   
  17.     /** initializes the transition with a duration and with an RGB color */  
  18.     virtual bool initWithDuration(float t, CCScene*scene ,const ccColor3B& color);  
  19.   
  20.     virtual bool initWithDuration(float t,CCScene* scene);   
  21.     virtual void onEnter();// 过渡回调  
  22.     virtual void onExit();  
  23. };  

所有的过渡场景都是CCTransitionScene的子类,有兴趣的可以看源码或红孩儿的博文。

看这里,它实现了onEnter。在这个函数里面才是实质上的过渡特效实现,就是一系列的动作。动作完了调finish(),finish里面又调setNewScene函数,这个函数比较重要:

[cpp] view plaincopyprint?
  1. void CCTransitionScene::setNewScene(float dt)  
  2. {      
  3.     CC_UNUSED_PARAM(dt);  
  4.     // [self unschedule:_cmd];   
  5.     // "_cmd" is a local variable automatically defined in a method   
  6.     // that contains the selector for the method  
  7.     this->unschedule(schedule_selector(CCTransitionScene::setNewScene));  
  8.     CCDirector *director = CCDirector::sharedDirector();  
  9.     // Before replacing, save the "send cleanup to scene"  
  10.     m_bIsSendCleanupToScene = director->isSendCleanupToScene();  
  11.     director->replaceScene(m_pInScene); // 看这里,这是后面要用的  
  12.     // enable events while transitions  
  13.     director->getTouchDispatcher()->setDispatchEvents(true);  
  14.     // issue #267  
  15.     m_pOutScene->setVisible(true);  
  16. }  

过渡特效就完了。

看主循环如何调度:直接看setNextScene函数

[cpp] view plaincopyprint?
  1. void CCDirector::setNextScene(void)  
  2. {  
  3.     // 布尔变量,当前场景是过渡场景则true,反之false  
  4.     bool runningIsTransition = dynamic_cast<CCTransitionScene*>(m_pRunningScene) != NULL;  
  5.     // 布尔变量,载入的场景是过渡场景则true,反之false  
  6.     bool newIsTransition = dynamic_cast<CCTransitionScene*>(m_pNextScene) != NULL;  
  7.   
  8.     // If it is not a transition, call onExit/cleanup  
  9.     // 如果载入的不是一个过渡场景,那么调用当前场景的onExit和cleanup  
  10.      if (! newIsTransition)  
  11.      {  
  12.          if (m_pRunningScene)// 有可能是个过渡场景  
  13.          {  
  14.              m_pRunningScene->onExitTransitionDidStart();  
  15.              m_pRunningScene->onExit();  
  16.          }  
  17.    
  18.          // issue #709. the root node (scene) should receive the cleanup message too  
  19.          // otherwise it might be leaked.  
  20.          if (m_bSendCleanupToScene && m_pRunningScene)  
  21.          {  
  22.              m_pRunningScene->cleanup();  
  23.          }  
  24.      }  
  25.   
  26.     if (m_pRunningScene)  
  27.     {  
  28.         m_pRunningScene->release();  
  29.     }  
  30.     // 当前场景指针指向载入场景  
  31.     m_pRunningScene = m_pNextScene;  
  32.     m_pNextScene->retain();  
  33.     m_pNextScene = NULL;  
  34.   
  35.     // 如果当前场景不是一个过渡场景,那么调用载入场景的onEnter和onEnterTransitionDidFinish  
  36.     if ((! runningIsTransition) && m_pRunningScene)  
  37.     {  
  38.         m_pRunningScene->onEnter();// 本质是调onEnter  
  39.         m_pRunningScene->onEnterTransitionDidFinish();  
  40.     }  
  41. }  


一开始两个布尔变量并不总是true,即使你每个场景都用了特效。原因如下:

看前面特效场景类的setNewScene函数,有一句director->replaceScene(m_pInScene)。

这个就将你的场景(CCScene::create()出来的那个,不是你包装的特效场景)设为要载入场景,而这个场景不是一个过渡场景,呵呵。

如果你调试TestCpp的TransitionsTest列子,你会发现这两个布尔变量总是一个true,一个false,呵呵。


本质上来说,一个过渡场景就是实现了CCScene的onEnter系列函数。可以仿照已有的列子自己写,嘿嘿。


就写这么多了,不知道说清楚了没有。

0 0
原创粉丝点击