Cocos2d-x 3.2 学习笔记(六)Layer

Layer 游戏中的背景容器,Layer类是Node类的一个子类,它实现了触屏事件代理(TouchEventsDelegate)协议。

LayerColor是Layer的一个子类,它实现了RGBAProtocol协议。

LayerGradient是LayerColor的一个子类,它在背景上画渐变效果。

LayerMultiple类是一个能够使它的子类进行复用的布景层类。

Sprite精灵不能直接放入舞台中,它需要作为Layer的子节点,通过Layer加入舞台场景中显示。

关于Layer的简单用法:

/************************************************************************/
/* 创建一个全屏的黑色布景层                                                                     */
/************************************************************************/
bool LayerTest::createLayer()
{
    auto layer = Layer::create();
    auto drawNode = DrawNode::create();
    layer->addChild(drawNode);
    auto widthN = Director::getInstance()->getVisibleSize().width;
    Vec2 points[] = { Vec2(widthN/4,0), Vec2(widthN,widthN/5), Vec2(widthN/3*2,widthN) };
    //绘制三角形
    drawNode->drawPolygon(points, sizeof(points)/sizeof(points[0]), Color4F(1,0,0,0.5), 4, Color4F(0,0,1,1));

    _layer->removeAllChildren();
    _layer->addChild(layer);
    return true;
}
/************************************************************************/
/* LayerColor是Layer的一个子类,它实现了RGBAProtocol协议。 它实现了Layer类的所有功能,还添加了以下这些新功能:
透明度
RGB颜色                                                                     */
/************************************************************************/
bool LayerTest::createLayerColor()
{
    auto size = Director::getInstance()->getVisibleSize();
    //创建一个红色背景的矩形(200x100)
    auto layer = LayerColor::create(Color4B::RED,200,100);
    layer->setPosition(size/2);
    _layer->removeAllChildren();
    _layer->addChild(layer);
    return true;
}
/************************************************************************/
/*
LayerGradient是LayerColor的一个子类,它在背景上画渐变效果。 它实现了LayerColor类的所有功能,还添加了以下这些新功能:
渐变方向
渐变最终颜色
插值模式
颜色沿着给定的向量插在起始颜色和终止颜色之间(从起点开始,到终点结束)。如果没有提供向量,则默认到(0,-1)点-一个从顶部到底部的淡入淡出。
如果‘compressedInterpolation‘不可用,你将看不到非基本向量的起始颜色和终止颜色;不过无论如何,一个平滑的渐变(包括终点)最终还是会呈现出来。
如果‘compressedInterpolation‘是可用的(默认模式),你将看到渐变的起始颜色和终止颜色。
*/
/************************************************************************/
bool LayerTest::createLayerGradient()
{
    //创建一个红色到绿色的过渡渐变效果背景(从左下角到右上角)
    auto layer = LayerGradient::create(Color4B::RED,Color4B::GREEN,Vec2(1,1));

    _layer->removeAllChildren();
    _layer->addChild(layer);
    return true;
}
/************************************************************************/
/*
一个能够使它的子类进行复用的布景层类。 功能:
-它支持一个或多个子类
-一次仅能激活一个孩子                                                                     */
/************************************************************************/
bool LayerTest::createLayerMultiplex()
{
    auto size = Director::getInstance()->getVisibleSize();
    auto allLayer = LayerMultiplex::create();

    auto layer = LayerColor::create(Color4B::RED,200,100);
    layer->setPosition(size/2);
    allLayer->addLayer(layer);

    auto layer1 = LayerColor::create(Color4B::GREEN,200,200);
    layer1->setPosition(size/2);
    allLayer->addLayer(layer1);

    auto layer2 = LayerColor::create(Color4B::WHITE,100,200);
    layer2->setPosition(size/2);
    allLayer->addLayer(layer2);

    _layer->removeAllChildren();
    _layer->addChild(allLayer);
    //选择看一个子层显示(这里的index是白色背景层)
    allLayer->switchTo(2);
    return true;
}

#ifndef __LAYERTEST__
#define __LAYERTEST__

#include "cocos2d.h"

USING_NS_CC;

class LayerTest : public Layer
{
public:
    static Scene* createScene();
    CREATE_FUNC(LayerTest);
    virtual bool init();
    static bool createLayer();
    static bool createLayerColor();
    static bool createLayerGradient();
    static bool createLayerMultiplex();
protected:
    bool onTouchBeganFun(Touch* touch,Event* ev);
};

#endif

LayerTest.h

#include "LayerTest.h"

std::function<bool()> demotest[]=
{
    LayerTest::createLayer,
    LayerTest::createLayerColor,
    LayerTest::createLayerGradient,
    LayerTest::createLayerMultiplex
};

static Layer* _layer = nullptr;
Scene* LayerTest::createScene()
{
    auto scene = Scene::create();
    _layer = LayerTest::create();
    scene->addChild(_layer);
    return scene;
}

bool LayerTest::init()
{
    auto event = EventListenerTouchOneByOne::create();
    event->onTouchBegan = CC_CALLBACK_2(LayerTest::onTouchBeganFun,this);
    this->_eventDispatcher->addEventListenerWithSceneGraphPriority(event,this);
    return true;
}
#define MAX_LAYER (sizeof(demotest) / sizeof(demotest[0]))
static int index = 0;
bool LayerTest::onTouchBeganFun(Touch* touch,Event* ev)
{
    index++;
    index = index % MAX_LAYER;
    demotest[index]();
    return true;
}

/************************************************************************/
/* 创建一个全屏的黑色布景层                                                                     */
/************************************************************************/
bool LayerTest::createLayer()
{
    auto layer = Layer::create();
    auto drawNode = DrawNode::create();
    layer->addChild(drawNode);
    auto widthN = Director::getInstance()->getVisibleSize().width;
    Vec2 points[] = { Vec2(widthN/4,0), Vec2(widthN,widthN/5), Vec2(widthN/3*2,widthN) };
    //绘制三角形
    drawNode->drawPolygon(points, sizeof(points)/sizeof(points[0]), Color4F(1,0,0,0.5), 4, Color4F(0,0,1,1));

    _layer->removeAllChildren();
    _layer->addChild(layer);
    return true;
}
/************************************************************************/
/* LayerColor是Layer的一个子类,它实现了RGBAProtocol协议。 它实现了Layer类的所有功能,还添加了以下这些新功能:
透明度
RGB颜色                                                                     */
/************************************************************************/
bool LayerTest::createLayerColor()
{
    auto size = Director::getInstance()->getVisibleSize();
    //创建一个红色背景的矩形(200x100)
    auto layer = LayerColor::create(Color4B::RED,200,100);
    layer->setPosition(size/2);
    _layer->removeAllChildren();
    _layer->addChild(layer);
    return true;
}

/************************************************************************/
/*
LayerGradient是LayerColor的一个子类,它在背景上画渐变效果。 它实现了LayerColor类的所有功能,还添加了以下这些新功能:
渐变方向
渐变最终颜色
插值模式
颜色沿着给定的向量插在起始颜色和终止颜色之间(从起点开始,到终点结束)。如果没有提供向量,则默认到(0,-1)点-一个从顶部到底部的淡入淡出。
如果‘compressedInterpolation‘不可用,你将看不到非基本向量的起始颜色和终止颜色;不过无论如何,一个平滑的渐变(包括终点)最终还是会呈现出来。
如果‘compressedInterpolation‘是可用的(默认模式),你将看到渐变的起始颜色和终止颜色。
*/
/************************************************************************/
bool LayerTest::createLayerGradient()
{
    //创建一个红色到绿色的过渡渐变效果背景(从左下角到右上角)
    auto layer = LayerGradient::create(Color4B::RED,Color4B::GREEN,Vec2(1,1));

    _layer->removeAllChildren();
    _layer->addChild(layer);
    return true;
}
/************************************************************************/
/*
一个能够使它的子类进行复用的布景层类。 功能:
-它支持一个或多个子类
-一次仅能激活一个孩子                                                                     */
/************************************************************************/
bool LayerTest::createLayerMultiplex()
{
    auto size = Director::getInstance()->getVisibleSize();
    auto allLayer = LayerMultiplex::create();

    auto layer = LayerColor::create(Color4B::RED,200,100);
    layer->setPosition(size/2);
    allLayer->addLayer(layer);

    auto layer1 = LayerColor::create(Color4B::GREEN,200,200);
    layer1->setPosition(size/2);
    allLayer->addLayer(layer1);

    auto layer2 = LayerColor::create(Color4B::WHITE,100,200);
    layer2->setPosition(size/2);
    allLayer->addLayer(layer2);

    _layer->removeAllChildren();
    _layer->addChild(allLayer);
    //选择看一个子层显示(这里的index是白色背景层)
    allLayer->switchTo(2);
    return true;
}

LayerTest.cpp

Cocos2d-x 3.2 学习笔记(六)Layer

时间: 2024-10-03 00:39:08

Cocos2d-x 3.2 学习笔记(六)Layer的相关文章

python之raw_input()(学习笔记六)

python之raw_input()(学习笔记六) 我们经常使用raw_input()读取用户的输入,如下例子所示: >>> name = raw_input('please input your name:'),截图如下: 下面简单说下,raw_input()与if搭配使用,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- birth = raw_input('birth:') if birth < 2000: print '0

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些

Linux System Programming 学习笔记(六) 进程调度

1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进程调度器需要使 处理器使用率最大化,并且提供 使多个进程并发执行的虚拟 Deciding which processes run, when, and for how long is the process scheduler's fundamental responsibility. 时间片:th

Lua学习笔记(六):函数-续

Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values).第一类值指:在Lua中函数和其他值(数值.字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:嵌套的函数可以访问他外部函数中的变量.这一特性给Lua提供了强大的编程能力. Lua中关于函数稍微难以理解的是函数也可以没有名字,匿名的.当我们提到函数名(比如print),实际上是说一个指向函数的变量,像持有其他类型的变量一样:

laravel3学习笔记(六)

原作者博客:ieqi.net ==================================================================================================== ORM Laravel3中MVC体系中Model里最重要的组成部分无疑是ORM了,ORM — object-relational mapper — 将数据操作面向对象化,使得整个web框架的核心风格统一,降低整体复杂度,为开发者提供便利. Laravel3中的ORM叫

IBatis.Net学习笔记六--再谈查询

在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的方式.在上一篇文章中我提到了三种方式,都是各有利弊:第一种方式当数据关联很多的情况下,实体类会很复杂:第二种方式比较灵活,但是不太符合OO的思想(不过,可以适当使用):第三种方式最主要的问题就是性能不太理想,配置比较麻烦. 下面是第四种多表查询的方式,相对第二种多了一点配置,但是其他方面都很好(当然

[傅里叶变换及其应用学习笔记] 六. 热方程讨论

这份是本人的学习笔记,课程为网易公开课上的斯坦福大学公开课:傅里叶变换及其应用. 上节课讲到,在对非周期函数进行傅里叶分析时,有 $C_k = \displaystyle{\frac{1}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}f(t)e^{-2\pi i\frac{k}{T}t}dt }$ $f(t) = \displaystyle{\sum_{k=-\infty}^{\infty}C_ke^{2\pi i\frac{k}{T}t} }$ 我们希望仅让$T\to

ActiveMQ学习笔记(六)——JMS消息类型

1.前言 ActiveMQ学习笔记(四)--通过ActiveMQ收发消息http://my.oschina.net/xiaoxishan/blog/380446 和ActiveMQ学习笔记(五)--使用Spring JMS收发消息http://my.oschina.net/xiaoxishan/blog/381209   中,发送和接受的消息类型都是TextMessage,即文本消息(如下面的代码所示).显然消息类型只有文本类型是不能满足要求的. //发送文本消息  session.create