本文转载自:http://www.eoeandroid.com/thread-546621-1-1.html

本文将结合最新版本的学习,作进一步修改。

非常感谢作者总结。原文如下:


【Cocos2d-x v3.0 亮点】

  • 使用 C++(C++11) 的特性取代了 Objective-C 的特性

  • 优化了 Labels

  • 优化了渲染器(比 v2.2 更快)

  • 新的事件分发机制

  • 物理引擎集成

  • 新的 UI 对象

  • 模板容器

* 使用 cocos2d::Map<> 替代了 CCDictionary , 用法

* 使用 cocos2d::Vector<> 替代了 CCArray, 用法

* 使用 cocos2d::Value 替代了 CCBool, CCFLoat, CCDouble, 用法

1、C++11 特性

C++11 FAQ请查看这里:http://www.stroustrup.com/C++11FAQ.html


1.1 新的关键字及语法

(1)nullptr

nullptr是为了解决NULL的二义性,因为NULL实际上代表的是0。

void f(int); //#1
void f(char *);//#2
//C++03
f(0); //二义性
//C++11
f(nullptr) //无二义性,调用f(char*)

(2)auto

根据上下文自动类型推导。

//v2.x
CCSprite *pSprite = CCSprite::create("HelloWorld.png");//v3.x
auto pSprite = Sprite::create("HelloWorld.png");

(3)decltype

decltype与此相反,从变量或表达式中获取类型。

int x = 3;
decltype(x) y = x;

(4)override

派生类重写基类的虚函数时,在函数的声明中加上override(非必须)。

这样可在编译时检测出对基类函数的错误重写。

struct B {virtual void f();virtual void g() const;void k();           // not virtual};
struct D : B {void f() override;  // OK: overrides B::f()void g() override;  // error: wrong typevoid k() override;  // error: B::k() is not virtual};

5)final

可用来修饰基类的虚函数,表示该函数不可被派生类重写即override。

struct B {virtual void f() const final; // do not overridevirtual void g();};struct D : B {void f() const; // error: D::f attempts to override final B::fvoid g();       // OK};

(6)序列for循环

在C++中for循环可以使用类似java的简化的for循环。

可以用于遍历数组,容器,string以及由begin和end函数定义的序列(即有Iterator)。

示例代码如下:[](int a, int b){ return a > b; }

map m{{"a", 1}, {"b", 2}, {"c", 3}};
for (auto p : m){cout<<p.first<<" :="" "<<p.second<<endl;[="" font][="" color]}

(7)lambda表达式

类似Javascript中的闭包,它可以用于创建并定义匿名的函数对象,以简化编程工作。

Lambda语法:[函数对象参数](操作符重载函数参数)->返回值类型{ 函数体 }

举例:

运用在MenuItem的回调函数:

auto closeItem = MenuItemImage::create("CloseNormal.png",
                                       "CloseSelected.png",
                                       [](Object* sender)
                                      {
                                        Director::getInstance()->end(); //直接在这里添加按钮要调用的代码
                                     } );

1.2 标准库 std::function 与 std::bind


  • std::function :可以定义类似函数指针的类型

  • std::bind:可以方便的绑定类的成员函数

这个常在Cocos2d-x中的回调函数中使用:

  • CallFunc  可以由 std::function 来创建。

  • CallFuncN 可以由 std::function 来创建。

  • CallFuncND和CallFuncO已经被移除,它们可以类似地由CallFuncN和CallFunc来创建。

  • MenuItem 支持 std::function 作为回调。

    std::function<void(const std::vector&, Event*)> onTouchesBegan;
    std::function<void(const std::vector&, Event*)> onTouchesMoved;
    std::function<void(const std::vector&, Event*)> onTouchesEnded;
    std::function<void(const std::vector&, Event*)> onTouchesCancelled;
      
    // new callbacks based on C++11
    #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
    #define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
    #define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
    #define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

MenuItem 示例:

// v2.1 版本
CCMenuItemLabel *item = CCMenuItemLabel::create(label, this, menu_selector(MyClass::callback));
  
// v3.0 版本 (短版本)
auto item = MenuItemLabel::create(label, CC_CALLBACK_1(MyClass::callback, this));
  
// v3.0 版本 (长版本)
auto item = MenuItemLabel::create(label, std::bind(&MyClass::callback, this, std::placeholders::_1));
  
// v3.0 中你也可以使用lambda表达式或者其他函数对象
auto item = MenuItemLabel::create(label,
                     [&](Object *sender) {
                         // do something. Item "sender" clicked
                      });

1.3 强类型枚举

以 k 开头的常量和枚举量,通常被定义为 int 或者简单的 enum 类型,现在已经被强类型枚举(enum class)所替代,这样有利于避免冲突和类型错误。

新的格式是:

示例:

2、去OC化

2.1 移除"CC"前缀以及free functions

(1)移除C++类的"CC"前缀

(2)free functions的变更

  • 对于 drawing primitives:

* 已经被添加到 DrawPrimitives 命名空间

* 移除 cc 前缀

  • 对于 gl proxy functions:

* 已经被添加到 GL 命名空间

* 移除 ccGL 前缀

示例:

2.2 使用 clone 替代 copy

  • clone():返回了一份 autoreleased 版本的拷贝。

  • copy():不再被支持,如果你使用它,仍然是可以编译的,但是代码会崩掉。

2.3 单例类采用了 getInstance 和 destroyInstance

  • getInstance:替代 shared***

  • destroyInstance:替代 end***

2.4 使用 Ref 代替了 Object

因为 Object 容易让人混淆,所以重命名为 Ref ,同时移除了和引用计数无关的函数,之前所有继承于 Object 的类现在都改为继承于 Ref。

2.5 getters

Getters 现在使用了 get 前缀。

当然 getters 在声明中也被标识为 const 。

示例:

// v2.1
virtual float getScale();
// v3.0
virtual float getScale() const;

2.6 POD 类型

接收 POD 类型作为参数的方法(比如:TexParams, Point, Size,等等)已经修改为传递成 const 型引用。

示例:

// v2.1
void setTexParameters(ccTexParams* texParams);
// v3.0
void setTexParameters(const ccTexParams& texParams);

3、新的渲染器

3.1 自动批处理

自动批处理功能意味着 渲染器将会把 多次绘制调用 打包为一次 大的绘制调用(AKA batch)。

组合绘制调用当然需要满足一定的条件:

  • 它仅工作在QuadCommand命令下(由Sprite和ParticleSystem对象使用);

  • QuadCommadnds 必须共享相同的材质ID:相同纹理ID、相同GLProgram、相同混合功能;

  • QuadCommands 必须是连续的;

如果这些条件都满足的话,渲染器 将会使用所有这些 QuadCommand 对象创建一个批处理(一次绘制调用)。

如果你不熟悉 OpenGL 的使用,批处理对于您游戏的能否拥有一个流畅的运行速度是很重要的,越少的批处理(绘制调用)越有利于您游戏的表现力。

3.2 自动剔除

目前,自动剔除功能只在 Sprite 对象中实现。

当 Sprite::draw() 被调用的时候,它将会检查 Sprite 是否超出屏幕,如果是的话,它将不会发送 QuadCommand 命令给 渲染器,因此可以获得一些性能上的提升。

3.3 全局 Z 值

  • Node 增加了新的函数 setGlobalZOrder() / getGlobalZOrder() 。

  • setZOrder() / getZOrder() 被替代为 setLocalZOrder() / getLocalZOrder() 。

  • globalZOrder 是一个float(不是int)的参数。这个值在渲染器中用来给RenderCommand排序。较低的值拥有较高的优先级。这意味着一个globalZorder为-10的节点会比一个globalZOrder为10 的节点优先绘制。

  • globalZOrder 为 0 (默认值)的节点将会根据 Scene Graph 顺序绘制。

  • 如果 globalZOrder 不变的话,Cocos2d-x v3.0 和 Cocos2d-x v2.2 行为一致。

  • globalZOrder() 和 localZOrder():

* globalZOrder是用于渲染器中用来给“绘制命令”排序的

* localZOrder是用于父节点的子节点数组中给节点对象排序的

3.4 Sprite 和 SpriteBatchNode

v2.2版本中推荐的优化游戏方式是将 SpriteBatchNode 对象设置为 Sprite 对象的父节点。

虽然使用 SpriteBatchNode 对象仍然是一个非常好的优化游戏的方式。

但是它仍然有一定的限制:

  • Sprite对象的孩子只能是Sprite(否则,Cocos2d-x会触发断言)

* Sprite父节点是SpriteBactchNode时,ParticleSystem不能作为Sprite的子节点。

* 这将导致当Sprite父节点是SpriteBatchNode时,不能使用ParallaxNode

  • 所有的 Sprite 对象必须共享相同的纹理ID (否则,Cocos2d-x 会触发断言)

  • Sprite 对象使用 SpriteBatchNode 的混合函数和着色器。

虽然v3.0仍然支持SpriteBatchNode(与之前版本拥有相同的特效和限制),但我们不鼓励使用它。相反,我们推荐直接使用Sprite,不需要将它作为子节点添加到SpriteBatchNode中。

但是,为了能让v3.0有更好的表现,你必须要确保你的Sprite对象满足以下条件:

  • 贡献相同的纹理ID(把它们放在一个spritesheet中,就像使用 SpriteBatchNode 一样)

  • 确保它们使用相同的着色器和混合函数(就像使用 SpriteBatchNode 一样)

如果这么做,Sprite将会像使用SpriteBatchNode一样的快。(在旧设备上大概慢了10%,在新设备上基本上察觉不出)

v2.2 和 v3.0 最大的区别在于

  • Sprite 对象可以有不同的纹理ID。

  • Sprite 对象可以有不同种类的 Node 作为子节点,包括 ParticleSystem。

  • Sprite 对象可以有不同的混合函数和不同的着色器。

但是如果你这么做,渲染器 可能无法对它所有的子节点进行批处理(性能较低)。但是游戏仍然可以正常运行,不会触发任何断言。

总结:

  • 保持将所有的精灵放在一张大的 spritesheet 中。

  • 使用相同的混合函数(使用默认)

  • 使用相同的着色器(使用默认)

  • 不要将精灵添加到 SpriteBatchNode

4、优化 LabelTTF / LabelBMFont / LabelAtlas

LabelTTF, LabelBMFont 和 LabelAtlas 将会被新的Label代替。

新的Label 带来的好处有:

  • 统一了创建 LabelTTF, LabelBMFont 和 LabelAtlas 的 API 。

  • 使用freetype生成labels的纹理,保证了在不同平台下labels有相同的效果。

  • 缓存纹理以提高性能。

5、新的事件分发机制

触摸事件,键盘事件,加速器事件和自定义事件等所有事件都由EventDispatcher分发。

TouchDispatcher,KeypadDispatcher,KeyboardDispatcher,AccelerometerDispatcher已被移除。

EventDispatcher 的特性主要有:

  • 事件的分发基于渲染顺序

  • 所有的事件都由 EventDispatcher 分发

  • 可以使用 EventDispatcher 来分发自定义事件

  • 可以注册一个 lambda 表达式作为回调函数

6、物理引擎集成

在 v3.0 中,我们把基于 Chipmunk2D 的物理引擎集成到 Cocos2d-x 中,通过这些特性,你可以很容易创建基于物理效果的游戏,而不必去理解物理引擎。

7、其他 API 变更

7.1 ccTypes.h

在 ccType.h 中删除结构命名中的"cc"前缀。

将全局函数移至静态成员函数,将全局常量移至静态成员常量。

全局函数变更示例:

// in v2.1
ccColor3B color3B = ccc3(0, 0, 0);
ccc3BEqual(color3B, ccc3(1, 1, 1));
ccColor4B color4B = ccc4(0, 0, 0, 0);
ccColor4F color4F = ccc4f(0, 0, 0, 0);
color4F = ccc4FFromccc3B(color3B);
color4F = ccc4FFromccc4B(color4B);
ccc4FEqual(color4F, ccc4F(1, 1, 1, 1));
color4B = ccc4BFromccc4F(color4F);
color3B = ccWHITE;
// in v3.0
Color3B color3B = Color3B(0, 0, 0);
color3B.equals(Color3B(1, 1, 1));
Color4B color4B = Color4B(0, 0, 0, 0);
Color4F color4F = Color4F(0, 0, 0, 0);
color4F = Color4F(color3B);
color4F = Color4F(color4B);
color4F.equals(Color4F(1, 1, 1, 1));
color4B = Color4B(color4F);
color3B = Color3B::WHITE;

7.2 弃用的函数和全局变量

8、新的数据结构

cocos2d::Map<>    替代了 CCDictionary

cocos2d::Vector<> 替代了 CCArray

cocos2d::Value    替代了 CCBool, CCFLoat, CCDouble

转载于:https://blog.51cto.com/zhuxianzhong/1599512

Cocos2d-x v3.2笔记——总结Cocos2d-x 3.x版本的一些变化相关推荐

  1. cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)

    原文地址:cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)作者:七贤林子 在cocos2d  0.9及以下版本中,CCAnimation中可以使用animationWit ...

  2. Git笔记(25) 选择修订版本

    Git笔记(25) 选择修订版本 1. 单个修订版本 1.1. 简短的 SHA-1 1.2. 分支引用 1.3. 引用日志 1.4. 祖先引用 2. 提交区间 2.1. 双点 2.2. 多点 2.3. ...

  3. 《资本论》读书笔记(2)第二卷第一章:资本形态变化及其循环

    <资本论>读书笔记(2)第二卷第一章:资本形态变化及其循环 +BIT祝威+悄悄在此留下版了个权的信息说: 货币资本的循环 第一阶段:资本家用手里的钱买来设备.原材料,雇来一批工人,或者说, ...

  4. 【PDF软件篇】Windows最强大的PDF笔记编辑软件-Drawboard PDF旧版本安装教程

    [PDF软件篇]Windows最强大的PDF笔记编辑软件-Drawboard PDF旧版本安装教程 需要做PDF笔记的强烈推荐Drawboard PDF,软件运行速度很快,不限制笔记编辑次数,上手简单 ...

  5. [cocos2d-x学习笔记][入门基础][塔防]塔防游戏中箭塔旋转并攻击实现

    1. 检测炮塔视线范围内距离它最近的敌人. int length=0; float index=0; for (int i=0; i<Game::allEnemy.size(); i++) { ...

  6. The Things Network LoRaWAN Stack V3 学习笔记

    The Things Network 是 LoRaWAN 行业里非常著名的 Network Server 提供方,尤其是开发者社区运营得非常好,吸引了很多开发者来使用他们的平台.接触的许多国外的厂家, ...

  7. The Things Network LoRaWAN Stack V3 学习笔记 2.5 LoRa节点配置接入

    前言 网关接入之后,再让节点接入.本篇笔记重点记录一些小坑,注意跳过. 小能手这段时间在学习 The Things Network LoRaWAN Stack V3,从使用和代码等角度对该 Stack ...

  8. The Things Network LoRaWAN Stack V3 学习笔记 1.2 源码编译

    前言 源码编译是重头戏,这节笔记记录如何使用 make 命令编译相关部件.由于部分包在墙外,带来了一点麻烦,还分享一个 replace 方式来翻墙的办法. 小能手这段时间在学习 The Things ...

  9. The Things Network LoRaWAN Stack V3 学习笔记 2.2 使用 CLI 进行 OAuth 登录

    前言 在上一篇笔记中已经将 Stack 运行起来了,现在可以着手用 CLI 来做一些测试,第一步是要先登录账户. 小能手这段时间在学习 The Things Network LoRaWAN Stack ...

最新文章

  1. re2正则表达式匹配引擎的c接口版本cre2的中文使用手册
  2. 详细介绍springData
  3. C语言-什么是尾递归
  4. 你不知道的 Chrome DevTools 玩法
  5. 【java】java 理解JDK中UUID的底层实现
  6. wpf esc key 检测不到_爬虫笔记之requests检测网站编码方式(zozo.jp)(碎碎念) - CC11001100...
  7. 关于信息化的全球进程的思考
  8. 树莓派百度云下载工具bypy
  9. 分享两款免费的MySQL性能监控工具
  10. SPSS常用的几种统计分析
  11. mysql5.5软件官方下载_MySQL5.5 64位下载
  12. word总页数不包含封面_word目录不包含封面 word 目录 不含封面
  13. Qt 字体大小的计算
  14. 京东咚咚架构演讲读后感
  15. Java 中Lambda表达式的使用详解
  16. Codevs 4246 奶牛的身高
  17. PDF怎么转换成jpg图片
  18. cocos2d 3.11获取机型和系统版本号
  19. 分布式事务实施方案总结
  20. queue.Queue和multiprocessing.Queue队列的区别

热门文章

  1. s和jquery设置disabled属性为true使按钮失效
  2. python django mysql_python测试开发django-10.django连接mysql
  3. c语言谢延红主编答案,C语言程序设计课程改革与实践.doc
  4. mysql主从复制的流程_MYSQL主从复制部署流程
  5. 阿里云服务器安装docker开发环境
  6. ELK快速搭建日志平台(基于7.9.3)
  7. python安装失败错误代码0x_详解雨林木风Win10提示“Python 0x80070643安装时发生严重错误”解决方法...
  8. 非期望产出的sbm模型_线性模型 vs. Logistic模型——离散选择模型之二
  9. 图像形状特征(二)--Hu距
  10. 系统学习机器学习之模型选择