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

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

概述欢迎转载:http://blog.csdn.net/fylz1125/article/details/8533970 吐槽一下,刚写了一个小时,这CSDN不知抽什么风就是发不了,我以为存草稿了就刷新了一下,结果没存草稿。擦... cocos2d-x引擎实现的场景切换特效有41个,我这里就不列举了。有兴趣的童鞋自行看源码或谷歌之,一大把介绍的。昨天看了红孩儿的场景切换,写的很详细,代码逐行注释。我这

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


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

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


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

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

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


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

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

[cpp] view plain copy print ? CCScene*scene=About::scene(); CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.2,scene));
而所谓的特效,实质上就是实现了CCScene的onEnter()系列函数。

就CCTransitionFade为例子看下:

? classCC_DLLCCTransitionFade:publicCCTransitionScene { protected: cccolor4Bm_tcolor; public: CCTransitionFade(); virtual~CCTransitionFade(); /**createstheTransitionwithadurationanDWithanRGBcolor *Example:FadeTransition::create(2,scene,ccc3(255,0);//redcolor */ staticCCTransitionFade*create(floatduration,CCScene*scene,constcccolor3B&color); staticCCTransitionFade*create( virtualboolinitWithDuration(floatt,CCScene*scene); virtualvoIDonEnter();//过渡回调 virtualvoIDonExit(); };
所有的过渡场景都是CCTransitionScene的子类,有兴趣的可以看源码或红孩儿的博文。

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

? voIDCCTransitionScene::setNewScene(floatdt) CC_UNUSED_ParaM(dt); //[selfunschedule:_cmd]; //"_cmd"isalocalvariableautomaticallydefinedinamethod //thatcontainstheselectorforthemethod this->unschedule(schedule_selector(CCTransitionScene::setNewScene)); CCDirector*director=CCDirector::sharedDirector(); //Beforereplacing,savethe"sendcleanuptoscene" m_bIsSendCleanupToScene=director->isSendCleanupToScene(); director->replaceScene(m_pInScene);//看这里,这是后面要用的 //enableeventswhileTransitions director->gettouchdispatcher()->setdispatchEvents(true); //issue#267 m_pOutScene->setVisible(true); }
过渡特效就完了。

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

? voIDCCDirector::setNextScene(voID) //布尔变量,当前场景是过渡场景则true,反之false boolrunningIsTransition=dynamic_cast<CCTransitionScene*>(m_pRunningScene)!=NulL; //布尔变量,载入的场景是过渡场景则true,反之false boolnewIsTransition=dynamic_cast<CCTransitionScene*>(m_pNextScene)!=NulL; //IfitisnotaTransition,callonExit/cleanup //如果载入的不是一个过渡场景,那么调用当前场景的onExit和cleanup if(!newIsTransition) { if(m_pRunningScene)//有可能是个过渡场景 m_pRunningScene->onExitTransitionDIDStart(); m_pRunningScene->onExit(); } //issue#709.therootnode(scene)shouldreceivethecleanupmessagetoo //otherwiseitmightbeleaked. if(m_bSendCleanupToScene&&m_pRunningScene) m_pRunningScene->cleanup(); } if(m_pRunningScene) m_pRunningScene->release(); //当前场景指针指向载入场景 m_pRunningScene=m_pNextScene; m_pNextScene->retain(); m_pNextScene=NulL; //如果当前场景不是一个过渡场景,那么调用载入场景的onEnter和onEnterTransitionDIDFinish if((!runningIsTransition)&&m_pRunningScene) m_pRunningScene->onEnter();//本质是调onEnter m_pRunningScene->onEnterTransitionDIDFinish(); }

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

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

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

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


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


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

总结

以上是内存溢出为你收集整理的cocos2d-x游戏开发(十一)细说场景切换全部内容,希望文章能够帮你解决cocos2d-x游戏开发(十一)细说场景切换所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1064631.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存