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

 
       可以看出,CCLayer是CCNode的子类,并且它还支持触屏、加速度传感器和键盘输入。除此之外,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)。

[原创]cocos2d-x研习录-第二阶 概念类之布场层类(CCLayer)的更多相关文章

  1. [原创]cocos2d-x研习录-第二阶 概念类之节点类(CCNode)

    节点类CCNode在基本概念中并不存在,它是为了建立基本概念之间的关联关系而抽象出来的中间辅助类.这个类在Cocos2D-x中极为重要,它为概念类之间搭建了一座宏伟的桥梁.它的继承关系图如下:     ...

  2. [原创]cocos2d-x研习录-第二阶 概念类之精灵类(CCSprite)

    上一节说布景层CCLayer是小容器,那么精灵类CCSprite就是容器添加的内容,它是构成游戏的主要元素.精灵这个名称应该是游戏专用,它表示游戏中玩家操作的主角.敌人.NPC(Non Player ...

  3. [原创]cocos2d-x研习录-第二阶 概念类之场景类(CCScene)

    场景类CCScene是Cocos2D-x在屏幕显示的内容,相当于游戏关卡或界面.CCDirector任何时候只能显示一个场景CCScene,游戏中可能存在若干场景,CCDirector通过场景切换达到 ...

  4. [原创]cocos2d-x研习录-第二阶 概念类之导演类(CCDirector)

    CCDirector类是游戏的组织和控制中心(总指挥),它控制着主屏幕的显示.场景的切换和显示,以及游戏的开始.结束和暂停.它的继承关系图如下:    CCDirector继承自基类CCObject, ...

  5. [原创]cocos2d-x研习录-第二阶 概念类之摄相机类(CCCamera)

    在Cocos2D-x中,每个CCNode都拥有一个摄像机类CCCamera.只有通过CCCamera,CCNode才会被渲染出来.当CCNode发生缩放.旋转和位置变化时,都需要覆盖CCCamera, ...

  6. [原创]cocos2d-x研习录-第二阶 基本框架

    了解完Cocos2D-x的基本概念和概念类之后,是不是有一种蠢蠢欲动的冲动,想要探究Cocos2D-x是如何完成这一切的.接着我将通过对Cocos2D-x自代的HelloCpp项目进行分析,初步了解C ...

  7. [原创]cocos2d-x研习录-第二阶 基本概念

    在Cocos2D-x引擎中,有几个非常重要的概念:导演(CCDirector).摄像机(CCCamera).场景(CCSecen).布景(CCLayer).精灵(CCSPrite)和动作(CCActi ...

  8. [原创]cocos2d-x研习录-第三阶 特性之动作

    在前面的Cocos2D-x的概念类中,我们了解到节点类CCNode.导演类CCDirector.场景类CCScene.布景层类CCLayer和精灵类CCSprite等,这些类都是构成游戏画面的基本元素 ...

  9. [原创]cocos2d-x研习录—前言

    我认为很多开发者面对层出不穷的新技术.新思想和新理念,最为之苦恼的是找不到行之有效的学习方法,对于知识的本质缺乏认识,虽阅读了大量教材,却无法将其融入自己的知识体系,并搭建自己的知识树.不可否认,教材 ...

随机推荐

  1. 个人练习--gif图流程

    1:素材图片a  图片b 2:窗口--->时间轴/动画 3:复制所选帧--->设置帧延迟 4:文件--->存储为WEB格式--->gif格式

  2. Oracle在归档模式下恢复

    =============== 数据库的完全恢复 =============== 在归档模式下数据库完全恢复时,数据库所经过的状态如下: 1.利用备份修复(Restores)损坏或丢失的数据文件,即将 ...

  3. rpc选择标准

    衡量RPC好用与否的几条标准: 真的像本地函数一样调用 使用简单,用户只需要关注业务即可 灵活,RPC调用的序列化方式可以自由定制,比如支持json,支持msgpack等方式 http://www.o ...

  4. Spring 事务管理 01 ——

    目录: 参考: 1.Spring 事务管理高级应用难点剖析: 第 1 部分

  5. HDU 1253 胜利大逃亡

    Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C ...

  6. Octopus系列之js公共函数

    货币选择 ChangeCurrency(this.value) 示例 <select name="currency" id="sl_currency" c ...

  7. Reflector反编译WinForm程序重建项目资源和本地资源

    工具:vs2012..NET Reflector8.1.0.35 要解决的问题: 通过Reflector反编译生成的代码可以编译通过并显示窗体的本地资源和项目资源图片 一.测试项目 两个图片分别放在项 ...

  8. erlang中的lists:foldl()的用法,格式转换实例应用

    lists:foldl(fun(),参数1,参数2):这个函数就是先把参数1传给fun()处理,然后将参数2(列表)中每一个元素,依次传给fun()函数进行处理. lists:foldl(fun(El ...

  9. cocos2d-x 中的坐标系

    cocos2d-x 中的坐标系是笛卡尔坐标系,向右为 x 轴正方向,向上为 y 轴正方向,以像素为单位 原点在屏幕左下角的坐标系叫世界坐标系,是整个游戏中的根基,直接添加到场景中的节点,设置的位置都是 ...

  10. ES6 基础版迭代器

    ES6中引入了generator function* get() { var result1 = yield c; var result2 = yield b; var result3 = yield ...