上面说场景CCScene相当于一个大容器,那么布景层类CCLayer就是大容器里的若干个小容器。每个游戏场景CCScene会有很多层CCLayer,每一层CCLayer负责各自的任务。看一下CCLayer的类继承关系图,如下:
可以看出,CCLayer是CCNode的子类,并且它还支持触屏、加速度传感器和键盘输入。除此之外,CCLayer还有很多子类,如下:
这些子类实现了很多UI(如菜单、列表视图、滚(滑)动视图、控件(按钮、开关、滑动条等)),这些子类的用法将在特性的GUI中详细介绍。我们还是重点关注CCLayer的内部结构和功能。
·CCLayer属性:
bool m_bIsTouchEnabled:是否使用触屏
bool m_bIsAccelerometerEnabled:是否使用加速度传感器
bool m_bIsKeypadEnabled:是否使用键盘输入
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 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 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,代码如下:
//这里初始化CCLayerMultiplexvoid 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方法切换CCLayervoid 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)。