‎Cocos2d-x 学习笔记(3.3) Layer

1.简介

Layer直接继承了Node。Layer类似Ps里图层的概念,也可以理解成一块透明玻璃。Scene类似Ps里的一张图像,也可以理解成堆放玻璃的箱子。

Layer能接收触摸事件、键盘事件、加速器事件。

导演类一次只能将一个Scene显示,例如存在登录场景、菜单场景、游戏场景,一个时刻只能一个场景被运行。

一个Scene可以包含多个Layer,例如游戏场景可以包含人物层、背景层、导航菜单栏层。每个Layer都包含了一些元素。

每个元素都有自己的动作。

2. Layer与触摸

Layer里触摸相关成员:

    bool _touchEnabled; // 是否启用触摸
    EventListener* _touchListener; //触摸监听器
    Touch::DispatchMode _touchMode; //触摸类型 单点or多点
    bool _swallowsTouches; //吞没

Layer里有两种触摸共8个触摸监听器的回调函数,可以被继承Layer的子类重写。

void setTouchEnabled(bool value)

本方法修改层是否能接收触摸事件,主要逻辑是:

  1. 参数与_touchEnabled不同时,将_touchEnabled修改为参数。
  2. 如果修改为true,则启用了触摸事件接收,根据触摸类型_touchMode创建相应的单点/多点触摸监听器,设置4个回调函数,并把新建的监听器赋给_touchListener。
  3. 如果修改为false,则关闭了触摸事件接收,从事件分发器中remove _touchListener, 并把_touchListener置空。

void setTouchMode(Touch::DispatchMode mode)

void setSwallowsTouches(bool swallowsTouches)

这两个方法会调用到上面的方法。setTouchMode两方法里,当启用了触摸时,setSwallowsTouches方法里,在修改要set的变量后,会执行:

            setTouchEnabled(false);
            setTouchEnabled(true);

第一行能将当前的监听器删除,第二行能根据_touchMode重新设置监听器。

3. LayerColor

颜色层直接继承了层Layer、颜色混合BlendProtocol。

颜色层在层的基础上,新增了:不透明度、RGB颜色、颜色混合。

有3种create方法创建颜色层。参数里可以设置RGBA数值和窗口大小:

LayerColor * LayerColor::create(const Color4B& color, GLfloat width, GLfloat height)

当不设置create参数时,使用默认值,即父类Layer的透明背景:

    Size s = Director::getInstance()->getWinSize();
    return initWithColor(Color4B(0,0,0,0), s.width, s.height);

构造方法里设置了默认的颜色混合:

LayerColor::LayerColor()
{
    // default blend function
    _blendFunc = BlendFunc::ALPHA_PREMULTIPLIED;
}

可以修改颜色层的属性:

void changeWidthAndHeight(GLfloat w ,GLfloat h)
void changeWidth(GLfloat w)
void changeHeight(GLfloat h)

BlendFunc& getBlendFunc()void setBlendFunc(const BlendFunc& blendFunc)void Node::setOpacity(GLubyte opacity)
void Node::setColor(const Color3B& color)

4.  LayerGradient

颜色渐变层LayerGradient直接继承了颜色层LayerColor。

除了有颜色层的RGBA、颜色混合,渐变层还有这些属性:渐变方向、渐变起终点颜色、渐变起终点透明度。

颜色渐变是从_startColor变换到_endColor,渐变方向为向量Vec2 _alongVector。

有3种create方法创建。可以带参数起终点颜色和方向向量实现渐变效果:

LayerGradient* LayerGradient::create(const Color4B& start, const Color4B& end, const Vec2& v)

当不设置create参数,默认起终点颜色是黑,方向由上至下,起终点透明度为255,效果类似于层Layer:

initWithColor(Color4B(0, 0, 0, 255), Color4B(0, 0, 0, 255));
initWithColor(start, end, Vec2(0, -1));

5. LayerRadialGradient

实现了颜色的径向变换。

6. LayerMultiplex

能管理多个层。

用容器Vector<Layer*> _layers存储layer,用_enabledLayer记录当前最后执行的layer。

用this->addChild(_layers.at(n))方法把某个layer加到当前场景中。

create方法可以传入多个layer:

LayerMultiplex* LayerMultiplex::createWithArray(const Vector<Layer*>& arrayOfLayers)
LayerMultiplex * LayerMultiplex::create(Layer * layer, ...)

能够切换当前layer,添加layer:

LayerMultiplex::switchTo(int n)
LayerMultiplex::addLayer(Layer* layer)

-

原文地址:https://www.cnblogs.com/deepcho/p/cocos2dx-layer.html