• cocos2d-x学习 之三


    在上一节中已经完成了开始界面的编写,我们从菜单的最下面开始写,我们先完成点下About按钮时所执行的动作。点下About按钮时执行的动作如下:

    1 void WelcomeLayer::aboutGameCallback(CCObject *sender )
    2 {
    3 #ifdef DEBUG
    4     CCLog("aboutGame");
    5 #endif
    6 
    7     CCDirector::sharedDirector()->pushScene(CCTransitionFade::create(0.5f, AboutLayer::scene() ));
    8 }

    当我们点下About按钮时将会完成游戏场景的切换,会由菜单场景切换到About场景。在这里切换时我们加了一个淡入淡出的动画效果,如果不加上动画,直接切换场景也是可以的,但是如果我们不加动画直接切换会显得太突兀了。在这里我们为了更好看一点我们还是加上动画吧。接着我们看看AboutLayer的实现。

    aboutlayer.h

     1  #ifndef ABOUT_LAYER_H
     2  #define ABOUT_LAYER_H
     3  
     4  #include "cocos2d.h"
     5  #include "BaserLayer.h"
     6  
     7  USING_NS_CC;
     8  
     9  class AboutLayer : public BaserLayer
    10  {
    11      public:
    12          AboutLayer();
    13          ~AboutLayer();
    14  
    15          virtual bool init();
    16  
    17          static CCScene* scene();
    18  
    19          CREATE_FUNC(AboutLayer);
    20  
    21          void setViews();
    22  
    23          void backCallback(CCObject *sender );
    24  };
    25  
    26  #endif

    这个里面的代码想必大家都熟悉了,就不在详细讲述了。接着我们看看他的实现文件,在这里我们只看看它初始化界面的函数setViews,代码如下:

     1 void AboutLayer::setViews()
     2 {
     3     setBackGroundImage("loading.png");
     4 
     5     CCSprite *title = CCSprite::create("menuTitle.png",CCRectMake(0,38,138,30));
     6     title->setAnchorPoint(ccp(0.5,1));
     7     title->setPosition(ccp(getWinSize().width/2,getWinSize().height-20));
     8 
     9     this->addChild(title);
    10 
    11     CCLabelBMFont *des = CCLabelBMFont::create("this Gmae is recorded by Study","arial-14.fnt");
    12     des->setPosition(ccp(getWinSize().width/2,getWinSize().height/2));
    13 
    14     this->addChild(des);
    15 
    16     CCLabelBMFont *back = CCLabelBMFont::create("back","arial-14.fnt");
    17 
    18     back->setScale(1.25f);
    19     CCMenuItemLabel *backLable =  CCMenuItemLabel::create(back,this,menu_selector(AboutLayer::backCallback));
    20     backLable->setAnchorPoint(ccp(0.5,1));
    21     backLable->setPosition(ccp(getWinSize().width/2,30));
    22 
    23     CCMenu *menu = CCMenu::create(backLable,NULL);
    24     menu->setPosition(CCPointZero);
    25 
    26     this->addChild(menu);
    27 
    28 
    29 }

    在这里我们看到了有新的元素出现:CCLabelBMFont 看这个控件的名字我们就知道他是用来显示文字的。具体的代码如下:

    1 CCLabelBMFont *des = CCLabelBMFont::create("this Gmae is recorded by Study","arial-14.fnt");

    其第一个参数为要显示的文字,第二个参数为要加载的字体,这个字体文件是游戏开发者提供的。

    在这里我们又创建了一个菜单用来实现返回的功能,在这里我们不能直接创建一个Label用来返回,因为CCLabelBMFont没有处理按下的信号,我们需要把他加入到CCMenu中实现该效果。我们注意到我们调用了CCLabelBMFont的setScale方法,这个方法主要实现当我们按下back Label是会有一个缩放的效果。其他的功能就和上一讲的差不多,在此处就不详细讲述了,我们主要看一下back的回调函数:

    1  void AboutLayer::backCallback(CCObject *sender )
    2  {
    3      CCLog("stratGame");
    4  
    5      CCDirector::sharedDirector()->pushScene(CCTransitionFade::create(0.5f, WelcomeLayer::scene() ));
    6  
    7  }

    在这个函数里我们完成了游戏场景的切换。接下来我们看看aboutlayer.cpp文件的完整实现

    aboutlayer.cpp

     1  #include "aboutlayer.h"
     2  #include "welcomelayer.h"
     3  #include "config.h"
     4  
     5  AboutLayer::AboutLayer()
     6  {
     7  }
     8  
     9  AboutLayer::~AboutLayer()
    10  {
    11  }
    12  
    13  /**
    14   *初始化方法
    15   */
    16  bool AboutLayer::init()
    17  {
    18      bool sRect = false;
    19  
    20      do
    21      {
    22          CC_BREAK_IF(!BaserLayer::init());
    23  
    24          setViews();
    25  
    26          sRect = true;
    27  
    28      }while(0);
    29  
    30      return sRect;
    31  }
    32  
    33  void AboutLayer::setViews()
    34  {
    35      setBackGroundImage("loading.png");
    36  
    37      CCSprite *title = CCSprite::create("menuTitle.png",CCRectMake(0,38,138,30));
    38      title->setAnchorPoint(ccp(0.5,1));
    39      title->setPosition(ccp(getWinSize().width/2,getWinSize().height-20));
    40  
    41      this->addChild(title);
    42  
    43      CCLabelBMFont *des = CCLabelBMFont::create("this Gmae is recorded by Study","arial-14.fnt");
    44      des->setPosition(ccp(getWinSize().width/2,getWinSize().height/2));
    45  
    46      this->addChild(des);
    47  
    48      CCLabelBMFont *back = CCLabelBMFont::create("back","arial-14.fnt");
    49  
    50      back->setScale(1.25f);
    51      CCMenuItemLabel *backLable =  CCMenuItemLabel::create(back,this,menu_selector(AboutLayer::backCallback));
    52      backLable->setAnchorPoint(ccp(0.5,1));
    53      backLable->setPosition(ccp(getWinSize().width/2,30));
    54  
    55      CCMenu *menu = CCMenu::create(backLable,NULL);
    56      menu->setPosition(CCPointZero);
    57  
    58      this->addChild(menu);
    59  }
    60  
    61  CCScene * AboutLayer::scene()
    62  {
    63      CCScene *scene = NULL;
    64  
    65      do
    66      {
    67          scene = CCScene::create();
    68          CC_BREAK_IF(!scene);
    69  
    70          AboutLayer *layer = AboutLayer::create();
    71          CC_BREAK_IF(!layer);
    72  
    73          scene->addChild(layer);
    74  
    75      }while(0);
    76  
    77      return scene;
    78  }
    79  
    80  void AboutLayer::backCallback(CCObject *sender )
    81  {
    82  #ifdef DEBUG
    83      CCLog("stratGame");
    84  #endif
    85  
    86      CCDirector::sharedDirector()->pushScene(CCTransitionFade::create(0.5f, WelcomeLayer::scene() ));
    87  
    88  }
    89  

    最后附上游戏的截图:

    最后上传一张gif的动态图吧

    顺便记录一下linux下生成动态图的命令:

    1 convert -delay 50 1.png -delay 100 2.png -delay 150 3.png -loop 0   animated.gif
  • 相关阅读:
    内置函数
    Day19 列表生成器、迭代器&生成器
    Day18 高阶函数
    Day17 装饰器
    searchBar 隐藏
    iOS UITableView UIScrollView 的支持触摸事件
    手势冲突UIPanGestureRecognizer 和UIPinchGestureRecognizer
    navigationController 之间的切换
    searchDisplayController 时引起的数组越界
    在适配iPhone 6 Plus屏幕的时候,模拟器上两边有很细的白边如何解决
  • 原文地址:https://www.cnblogs.com/jjxxjnzy/p/3477914.html
Copyright © 2020-2023  润新知