玩技术,Geeker
一个原创技术文章分享网站

菜鸟学习Cocos2d-x 3.x——说说布景层Layer

基础介绍

在《菜鸟学习Cocos2d-x 3.x——基础概念》这篇文章中已经对布景层Layer进行了概要总结,而这里将进行更进一步的分析。

布景层LayerNode类的子类,Layer的特殊之处在于它可以响应事件。在实际项目中,Layer也是一个容器,作为精灵、菜单、等等的容器。SceneLayer的容器,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()返回包含该LayerScene,它的实现如下:

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; \
    } \
}

很清楚的看到,该宏扩展开来以后,就是创建Layercreate函数,在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, 0, 100));
scene->addChild(layer);

这样就创建了一个带有颜色布景层的场景。LayerColor类作为一个带颜色的布景层,在开发中可以给我们做特效带来方便,后续会总结如何使用颜色布景层做一些特效。

多层布景层类LayerMultiplex

在游戏开发中,一般会把游戏分为两部分:一部分是游戏界面部分,也就是常说的UI部分;另 一部分就是游戏本身部分。有时UI有很多页面,在页面中用的图也并不是很多,不需要使用切换场景,只需把不同页面做成不同的布景层,然后切换布景层。那么这就需要一个“管理者” 来管理这些界面,这时候就要使用LayerMultiplex 类。

在很多游戏中都需要在不同的界面中使用相同的几个变量,如果不使用LayerMultiplex,就需要做大量的变量保存工作,那样你就会深陷变量的泥潭当中。

总结

继承自Layer的子类还有很多,比如MenuControl等等。而这些继承自Layer的子类,在后续使用到的时候再继续细的分析。

这篇文章总结的也比较粗糙,没有多少干货,主要这个系列的文章都是定位于初学者,对于初学者来说,足以。

2014年11月13日 于深圳。

打赏

未经允许不得转载:果冻想 » 菜鸟学习Cocos2d-x 3.x——说说布景层Layer

分享到:更多 ()

评论 8

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #3

    我看到这样的头疼,哈哈····

    Me.稀奇3年前 (2014-11-16)回复
  2. #2

    全部支持C++11了?cocosx速度还挺快

    eliteYang3年前 (2014-11-17)回复
    • 根据目前的情况,Cocos2d-x v3.x都在支持C++11.

      果冻想3年前 (2014-11-17)回复
  3. #1

    收益了,谢谢分享

    冰释物语3年前 (2015-01-19)回复

在这里玩技术,享受技术带来的疯狂

捐赠名单关于果冻