布景层Layer
是Node
类的子类,Layer
的特殊之处在于它可以响应事件。在实际项目中,Layer
也是一个容器,作为精灵、菜单、等等的容器。Scene
是Layer
的容器,Scene
可以用来管理Layer
,而Layer
又是其它对象的容器。Layer
就是因为它可以响应事件而变的这么厉害。它可以处理触摸、键盘和重力计事件。下面我们就来看看实际工作中是如何使用Layer
的,关于事件处理,后续会专门总结,这里就不涉及事件的处理了。
实际是怎么做的?
在实际开发中,我们建立自己的布景层,通常会建立一个新的类,这个新的类的父类为Layer
。比如以下代码:
class HelloWorld : public cocos2d::Layer { public: static cocos2d::Scene* createScene(); virtual bool init(); // implement the "static create()" method manually CREATE_FUNC(HelloWorld); };
HelloWorld
就是我们创建的新的Layer
。函数createScene()
返回包含该Layer
的Scene
,它的实现如下:
Scene* HelloWorld::createScene() { // 'scene' is an autorelease object auto scene = Scene::create(); // 'layer' is an autorelease object auto layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; }
代码是通过HelloWorld::create()
创建的这个Layer
,但是HelloWorld::create()
是哪来的?在HelloWorld
类中并没有这个静态函数啊。这就需要说说在HelloWorld
类中的CREATE_FUNC
宏,该宏的定义如下:
#define CREATE_FUNC(__TYPE__) \ static __TYPE__* create() \ { \ __TYPE__ *pRet = new __TYPE__(); \ if (pRet && pRet->init()) \ { \ pRet->autorelease(); \ return pRet; \ } \ else \ { \ delete pRet; \ pRet = NULL; \ return NULL; \ } \ }
很清楚的看到,该宏扩展开来以后,就是创建Layer
的create
函数,在create
函数中又调用了init
函数。init
函数是Layer
函数中的一个虚函数,我们继承自Layer
类以后,需要实现该虚函数,完成Layer
的初始化,比如需要在Layer
中放哪些元素啊,等等内容。
在实际开发中,我们就是这么做的,后续我会通过实际的游戏实例进行分析。Layer
是很多类的父类,下面就通过Layer
的两个具体的子类来用一用Layer
。
颜色布景层类LayerColor
颜色布景类LayerColor
类是Layer
类的子类,包含了Layer
类的特性,并且还可以为布景层添加颜色和设置布景层的透明度。
auto scene = Scene::create(); auto layer = LayerColor::create(Color4B(255, 0, 100)); scene->addChild(layer);
这样就创建了一个带有颜色布景层的场景。LayerColor
类作为一个带颜色的布景层,在开发中可以给我们做特效带来方便,后续会总结如何使用颜色布景层做一些特效。
多层布景层类LayerMultiplex
在游戏开发中,一般会把游戏分为两部分:一部分是游戏界面部分,也就是常说的UI部分;另 一部分就是游戏本身部分。有时UI有很多页面,在页面中用的图也并不是很多,不需要使用切换场景,只需把不同页面做成不同的布景层,然后切换布景层。那么这就需要一个“管理者” 来管理这些界面,这时候就要使用LayerMultiplex
类。
在很多游戏中都需要在不同的界面中使用相同的几个变量,如果不使用LayerMultiplex
,就需要做大量的变量保存工作,那样你就会深陷变量的泥潭当中。
总结
继承自Layer
的子类还有很多,比如Menu
、Control
等等。而这些继承自Layer
的子类,在后续使用到的时候再继续细的分析。