《Cocos2d学习之路》七、场景切换效果TransitionScene

前端之家收集整理的这篇文章主要介绍了《Cocos2d学习之路》七、场景切换效果TransitionScene前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

转载请说明出处:http://www.jb51.cc/article/p-sirftvig-bas.html

github地址:https://github.com/teffy/cocos2dx


这几天接着看了一下场景切换的效果TransitionScene,而cocos也在系统中提供了很多种不同的切换效果,那么我们先看一下TransitionScene的类继承关系图:


每一个类在cocos2d的官网文档中有说明

而且在官方demo的cpp-test中也有demo,我也跟着写了一遍

首先是要理解一下一些宏定义

  1. #define STRINGIFY(x) #x
  2. #define TRANS(__classname__){\//根据传入的类名构造一个结构体,结构体内有一个function和一个name,类似于javaXXX.class经过反射可以拿到很多东西
  3. [](float t,Scene* s){ return __classname__::create(t,s);},\
  4. STRINGIFY(__classname__),\
  5. }
  6.  
  7. struct transitions{//结构体
  8. std::function<TransitionScene*(float t,Scene* s)> function;
  9. const char* name;
  10. }transitions[] = {//结构体数组,用来保存定义的类的create方法和name
  11. TRANS(MTransitionCrossFade),TRANS(MTransitionFade),TRANS(MTransitionFadeTR),TRANS(MTransitionFadeBL),TRANS(MTransitionFadeDown),TRANS(MTransitionFadeUp),TRANS(MTransitionJumpZoom),TRANS(MTransitionFlipAngular_DOWN),TRANS(MTransitionFlipAngular_LEFT),TRANS(MTransitionFlipAngular_RIGHT),TRANS(MTransitionFlipAngular_UP),TRANS(MTransitionFlipX_DOWN),TRANS(MTransitionFlipX_LEFT),TRANS(MTransitionFlipX_RIGHT),TRANS(MTransitionFlipX_UP),TRANS(MTransitionFlipY_DOWN),TRANS(MTransitionFlipY_LEFT),TRANS(MTransitionFlipY_RIGHT),TRANS(MTransitionFlipY_UP),TRANS(MTransitionZoomFlipAngular),TRANS(MTransitionZoomFlipX_DOWN),TRANS(MTransitionZoomFlipX_LEFT),TRANS(MTransitionZoomFlipX_RIGHT),TRANS(MTransitionZoomFlipX_UP),TRANS(MTransitionZoomFlipY_DOWN),TRANS(MTransitionZoomFlipY_LEFT),TRANS(MTransitionZoomFlipY_RIGHT),TRANS(MTransitionZoomFlipY_UP),TRANS(MTransitionShrinkGrow),TRANS(MTransitionSlideInL),TRANS(MTransitionSlideInB),TRANS(MTransitionSlideInR),TRANS(MTransitionSplitCols),TRANS(MTransitionSplitRows),TRANS(MTransitionTurnOffTiles),};
  12.  
  13. #define MAX_TRANSITION_COUNT (sizeof(transitions)/sizeof(transitions[0]))
  1. TransitionScene* createTranstion(int _index,float t,Scene* s){
  2. //Director::getInstance()->setDepthTest(false);
  3. return transitions[_index].function(t,s);
  4. }
然后就是每一个切换效果的类,例举一个
  1. class MTransitionTurnOffTiles : TransitionTurnOffTiles{
  2. public:
  3. static TransitionScene* create(float duration,Scene* scene){
  4. return TransitionTurnOffTiles::create(duration,scene);
  5. }
  6. };
为了可以来回切换着看这些效果,通过向MainScene中添加不同的layer,每一个layer中有三个按钮,点击按钮的时候,然后构造一个切换效果Scene,进行切换场景,具体看code
  1. LayerOne::LayerOne(){
  2. init();
  3. }
  4. LayerOne::~LayerOne(){}
  5. bool LayerOne::init(){
  6. if (!Layer::init()) {
  7. return false;
  8. }
  9.  
  10. Size visibleSize = Director::getInstance()->getVisibleSize();
  11. Vec2 origin = Director::getInstance()->getVisibleOrigin();
  12.  
  13. MenuItemImage* restart = MenuItemImage::create("res/r1.png","res/r2.png",CC_CALLBACK_1(LayerOne::menuRestartCallback,this));
  14. restart->setPosition(Vec2(visibleSize.width / 2,restart->getContentSize().height));
  15. MenuItemImage* back = MenuItemImage::create("res/b1.png","res/b2.png",CC_CALLBACK_1(LayerOne::menuBackCallback,this));
  16. back->setPosition(Vec2(visibleSize.width / 2 - restart->getContentSize().width*1.5,back->getContentSize().height));
  17. MenuItemImage* forward = MenuItemImage::create("res/f1.png","res/f2.png",CC_CALLBACK_1(LayerOne::menuForwardCallback,this));
  18. forward->setPosition(Vec2(visibleSize.width / 2 + restart->getContentSize().width*1.5,forward->getContentSize().height));
  19. auto menu = Menu::create(restart,back,forward,NULL);
  20. menu->setPosition(Vec2::ZERO);
  21. this->addChild(menu,1);
  22.  
  23. auto label = Label::createWithTTF("LayerOne","fonts/Marker Felt.ttf",24);
  24. label->setPosition(Vec2(origin.x + visibleSize.width / 2,origin.y + visibleSize.height - label->getContentSize().height));
  25. this->addChild(label,1);
  26. auto transitionName = Label::createWithTTF(transitions[transition_index].name,24);
  27. transitionName->setPosition(Vec2(origin.x + visibleSize.width / 2,origin.y + visibleSize.height - transitionName->getContentSize().height * 2));
  28. this->addChild(transitionName,1);
  29. auto sprite = Sprite::create("res/background1.png");
  30. sprite->setPosition(Vec2(visibleSize.width / 2 + origin.x,visibleSize.height / 2 + origin.y));
  31. this->addChild(sprite,0);
  32. return true;
  33. }
  34.  
  35. void LayerOne::menuRestartCallback(Ref* pSender){
  36. auto go = MainScene::createScene();
  37. Director::getInstance()->replaceScene(go);
  38. }
  39.  
  40. void LayerOne::menuBackCallback(Ref* pSender){
  41. transition_index--;
  42. if (transition_index < 0){
  43. transition_index += MAX_TRANSITION_COUNT;
  44. }
  45.  
  46. Scene* s = MainScene::createScene();
  47. Layer* layer2 = new LayerTwo();
  48. s->addChild(layer2);
  49.  
  50. auto scene = createTranstion(transition_index,DURATION,s);
  51. if (scene){
  52. Director::getInstance()->replaceScene(scene);
  53. }
  54. }
  55.  
  56. void LayerOne::menuForwardCallback(Ref* pSender){
  57. transition_index++;
  58. transition_index = transition_index % MAX_TRANSITION_COUNT;
  59. Scene* s = MainScene::createScene();
  60. Layer* layer2 = new LayerTwo();
  61. s->addChild(layer2);
  62.  
  63. auto scene = createTranstion(transition_index,s);
  64. if (scene){
  65. Director::getInstance()->replaceScene(scene);
  66. }
  67. }
另外一个LayerTwo也是类似,只不过背景图片不同

win上可以运行,Android下,我刚开始不能run as,会报一些宏定义的错误,但是用命令编译过之后就好了

android下效果图:



点击下载代码及资源

(后面发现少了点,我补充下)

猜你在找的Cocos2d-x相关文章