在上一节中已经完成了开始界面的编写,我们从菜单的最下面开始写,我们先完成点下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