[原创]cocos2d-x研习录-第二阶 概念类之布场层类(CCLayer)

上面说场景CCScene相当于一个大容器,那么布景层类CCLayer就是大容器里的若干个小容器。每个游戏场景CCScene会有很多层CCLayer,每一层CCLayer负责各自的任务。看一下CCLayer的类继承关系图,如下:

[原创]cocos2d-x研习录-第二阶 概念类之布场层类(CCLayer)
 
       可以看出,CCLayer是CCNode的子类,并且它还支持触屏、加速度传感器和键盘输入。除此之外,CCLayer还有很多子类,如下:
[原创]cocos2d-x研习录-第二阶 概念类之布场层类(CCLayer)
      这些子类实现了很多UI(如菜单、列表视图、滚(滑)动视图、控件(按钮、开关、滑动条等)),这些子类的用法将在特性的GUI中详细介绍。我们还是重点关注CCLayer的内部结构和功能。
  
  ·CCLayer属性:
    bool m_bIsTouchEnabled:是否使用触屏
    bool m_bIsAccelerometerEnabled:是否使用加速度传感器
    bool m_bIsKeypadEnabled:是否使用键盘输入
 
  ·CCLayer方法:
    bool init():初始化CCLayer
    void onEnter():当进入布景层时调用
    void onExit():当离开布景层时调用
    void onEnterTransitionDidFinish():过场动画结束时调用
   
    //触屏事件响应
    bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent):触屏开始调用
    void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent):触屏移动调用
    void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent):触屏结束调用
    void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent):触屏取消调用
 
    //多点触控事件响应
    void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent):触屏开始调用(多点触控)
    void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent):触屏移动调用(多点触控)
    void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent):触屏结束调用(多点触控)
    void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent):触屏取消调用(多点触控)
   
    void didAccelerate(CCAcceleration* pAccelerationValue):加速度传感器
    void registerWithTouchDispatcher(void):注册触屏事件
 
   以上是CCLayer的主要属性和方法,可以看出CCLayer增加了对触屏、加速度传感器和键盘输入的支持。这在特性中将有详细讲解,这里不再赘述。
  
   下面再介绍一个比较重要的类CCLayerMultiplex。从继承关系中知,它是CCLayer的子类,作用是管理多个CCLayer对象。这个类在开发游戏时非常有用。我们知道,要显示不同游戏界面,是通过CCDirector切换CCScene完成。如果两个场景之间差异很小(如仅背景不同),通过切换场景的方式显示界面,未免有点小提大作。其实,我们只需要切换不同的地方即可,不必将整个场景都切换了。这时,CCLayerMultiplex就派上用场了。我们可以不必切换场景,只需要通过CCLayerMultiplex的switchTo方法切换场景的布景层CCLayer即可。CCLayerMultiplex有如下两个成员变量:
    unsigned int m_nEnabledLayer:当前使用的CCLayer
    CCArray*     m_pLayers     : CCLayer容器
   这样,CCLayerMultiplex就具有管理CCLayer的能力,可以操作使用哪个CCLayer完成场景显示。
   在TestCpp项目中的菜单CCMenu测试中,使用了CCLayerMultiplex,代码如下:
//这里初始化CCLayerMultiplex
void MenuTestScene::runThisTest()
{
    CCLayer* pLayer1 = new MenuLayerMainMenu();
    CCLayer* pLayer2 = new MenuLayer2();
    CCLayer* pLayer3 = new MenuLayer3();
    CCLayer* pLayer4 = new MenuLayer4();
    CCLayer* pLayer5 = new MenuLayerPriorityTest();
    CCLayerMultiplex* layer = CCLayerMultiplex::create(pLayer1, pLayer2, pLayer3, pLayer4, pLayer5, NULL);
    addChild(layer, 0);
    pLayer1->release();
    pLayer2->release();
    pLayer3->release();
    pLayer4->release();
    pLayer5->release();
    CCDirector::sharedDirector()->replaceScene(this);
}
 
//这里使用CCLayerMultiplex的switchTo方法切换CCLayer
void MenuLayerMainMenu::menuCallbackConfig(CCObject* sender)
{
    ((CCLayerMultiplex*)m_pParent)->switchTo(3);
}
 
CCLayer就介绍到这里。
-------------------------------------------------------------------------------------------------------------------

注:本人在本博客的原创文章采用创作共用版权协议http://creativecommons.org/licenses/by-nc-sa/2.5/cn/), 要求署名、非商业用途和保持一致。要求署名包含注明我的网名及文章来源(我的博客地址:http://www.cnblogs.com/binbingg)。

上一篇:编译qt


下一篇:ArcGIS API for Silverlight中专题地图的实现浅析