【唠叨】
本节摘自:
(1)v3.0 发布说明:
https://https://www.doczj.com/doc/743223632.html,/fusijie/Cocos2d-x3.0-Release-Note/blob/master/cocos2d-x_v3.0_release_notes.md
(2)C++11 新特性:https://www.doczj.com/doc/743223632.html,/ls1122/article/details/38339851
【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 特性
1.1、新的关键字及语法
(1)nullptr
nullptr 是为了解决NULL 的二义性,因为NULL 实际上代表的是0。 1 2 3 4 //
void f(int); //#1
void f(char *);//#2
5 6 7 8 9
//C++03
f(0); //二义性
//C++11 f(nullptr) //无二义性,调用f(char*)
// (2)auto
根据上下文自动类型推导。
1 2 3 4 5 6 7 //
//v2.x CCSprite *pSprite = CCSprite::create("HelloWorld.png");
//v3.x auto pSprite = Sprite::create("HelloWorld.png");
// (3)decltype
decltype 与此相反,从变量或表达式中获取类型。
1 2 3 4 //
int x = 3; decltype(x) y = x;
// (4)override
派生类重写基类的虚函数时,在函数的声明中加上override(非必须)。 这样可在编译时检测出对基类函数的错误重写。
1 2 3 4 5 6 7 //
struct B {
virtual void f();
virtual void g() const;
void k(); // not virtual
}; struct D : B {
8 9 10 11
1
2
void f() override; // OK: overrides B::f()
void g() override; // error: wrong type void k() override; // error: B::k() is not virtual
};
// (5)final
可用来修饰基类的虚函数,表示该函数不可被派生类重写即override 。 1 2 3 4
5
6 7
8
9
10 1
1 //
struct B {
virtual void f() const final; // do not overr ide virtual void g(); };
struct D : B { void f() const; // error: D::f attempts to o verride final B::f void g(); // OK
}; // (6)序列for 循环
在C++中for 循环可以使用类似java 的简化的for 循环。
可以用于遍历数组,容器,string 以及由begin 和end 函数定义的序列(即有Iterator )。
示例代码如下:
1 2 3 4 //
map
for (auto p : m){ cout<
5 6 }
// (7)lambda 表达式
类似Javascript 中的闭包,它可以用于创建并定义匿名的函数对象,以简化编程工作。
Lambda 语法:[函数对象参数](操作符重载函数参数)->返回值类型{ 函数体 }
举例: [](int a, int b){ return a > b; }
运用在MenuItem 的回调函数:
1
2
3
4
5
6
7
8 // auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png",
[](Object* sender) { Director::getInstance()->end(); //直接在这里添加按钮要调用的代码 } ); //
1.2、std::function 与 std::bind
std::function :可以定义类似函数指针的类型
std::bind :可以方便的绑定类的成员函数
这个常在cocos2dx 中的回调函数中使用:
> CallFunc 可以由 std::function
> CallFuncN 可以由 std::function
> CallFuncND 和CallFuncO 已经被移除,它们可以类似地由CallFuncN 和CallFunc 来创建。
> MenuItem 支持 std::function
2 3 4 // std::function
std::function
5 6 7
8 9 1
11
12 TouchesMoved;
std::function
// 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::placeho lders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeho lders::_2, std::placeholders::_3, ##__VA_ARGS__)
//
MenuItem 示例:
1 2 3 4 5
6
7 8 9
10
11
1//
// v2.1 版本
CCMenuItemLabel *item = CCMenuItemLabel::create(label, t his, menu_selector(MyClass::callback));
// v3.0 版本 (短版本) auto item = MenuItemLabel::create(label, CC_CALLBACK_1(M yClass::callback, this));
// v3.0 版本 (长版本) auto item = MenuItemLabel::create(label, std::bind(&MyCl ass::callback, this, std::placeholders::_1)); // v3.0 中你也可以使用lambda 表达式或者其他函数对象
2
1 3
1 4
1 5
1 6
auto item = MenuItemLabel::create(label,
[&](Object *sender) {
// do something. Item "sender" clicked
});
//
1 2 3 4 5 6 7
// v2.1 virtual float getScale();
// v3.0 virtual float getScale() const;
//
2.6、POD 类型
接收 POD 类型作为参数的方法(比如:TexParams, Point, Size,等等)已经修改为传递成 const 型引用。
示例:
1 2 3 4 5 6 7 //
// 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,AccelerometerDispat cher已被移除。
EventDispatcher 的特性主要有:
> 事件的分发基于渲染顺序
> 所有的事件都由EventDispatcher 分发
> 可以使用 EventDispatcher 来分发自定义事件
> 可以注册一个lambda 表达式作为回调函数
6、物理引擎集成
在 v3.0 中,我们把基于 Chipmunk2D 的物理引擎集成到 Cocos2d-x 中,通过这些特性,你可以很容易创建基于物理效果的游戏,而不必去理解物理引擎。
7、其他 API 变更
7.1、ccTypes.h
在 ccType.h 中删除结构命名中的"cc"前缀。
将 全局函数 移至 静态成员函数 ,将 全局常量 移至 静态成员常量 。 | v2.1 struct names | v3.0 struct names |
| ccColor3B | Color3B |
| ccColor4B | Color4B |
| ccColor4F | Color4F |
| ccVertex2F | Vertex2F |
| ccVertex3F | Vertex3F |
| ccTex2F | Tex2F |
| ccPointSprite | PointSprite |
| ccQuad2 | Quad2 |
| ccQuad3 | Quad3 |
| ccV2F_C4B_T2F | V2F_C4B_T2F |
| ccV2F_C4F_T2F | V2F_C4F_T2F |
| ccV3F_C4B_T2F | V3F_C4B_T2F |
| ccV2F_C4B_T2F_Triangle | V2F_C4B_T2F_Triangle |
| ccV2F_C4B_T2F_Quad | V2F_C4B_T2F_Quad |
| ccV3F_C4B_T2F_Quad | V3F_C4B_T2F_Quad |
| ccV2F_C4F_T2F_Quad | V2F_C4F_T2F_Quad |
| ccBlendFunc | BlendFunc |
| ccT2F_Quad | T2F_Quad |
| ccAnimationFrameData | AnimationFrameData |
全局函数变更示例:
1 2 3 4 5 6 //
// 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);
7 8 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 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;
//
| ccpProject | Point::project |
| ccpRotate | Point::rotate |
| ccpUnrotate | Point::unrotate |
| ccpLengthSQ | Point::getLengthSq() |
| ccpDistanceSQ | Point::getDistanceSq |
| ccpLength | Point::getLength |
| ccpDistance | Point::getDistance |
| ccpNormalize | Point::normalize |
| ccpForAngle | Point::forAngle |
| ccpToAngle | Point::getAngle |
| ccpClamp | Point::getClampPoint |
| ccpFromSize | Point::Point |
| ccpCompOp | Point::compOp |
| ccpLerp | Point::lerp |
| ccpFuzzyEqual | Point::fuzzyEqual |
| ccpCompMult | Point::Point |
| ccpAngleSigned | Point::getAngle |
| ccpAngle | Point::getAngle |
| ccpRotateByAngle | Point::rotateByAngle |
| ccpLineInersect | Point::isLineIntersect |
| ccpSegmentIntersect | Point::isSegmentIntersect |
| ccpIntersectPoint | Point::getIntersectPoint |
| v2.1 names | v3.0 names |
| CCPointMake | Point::Point |
| CCSizeMake | Size::Size |
| CCRectMake | Rect::Rect |
| PointZero | Point::ZERO |
| SizeZero | Size::ZERO |
| RectZero | Rect::ZERO |
| v2.1 names | v3.0
names |
| TiledGrid3DAction::tile | TiledGrid3DAction::getTile |
| TiledGrid3DAction::originalTile | TiledGrid3DAction::getOriginalTile |
| TiledGrid3D::tile | TiledGrid3D::getTile |
| TiledGrid3D::originalTile | TiledGrid3D::getOriginalTile |
| Grid3DAction::vertex | Grid3DAction::getVertex |
| Grid3DAction::originalVertex | Grid3DAction::getOriginalVertex |
| Grid3D::vertex | Grid3D::getVertex | | Grid3D::originalVertex | Grid3D::getOriginalVertex |
| v2.1 names | v3.0
names |
| Configuration::sharedConfiguration |
Configuration::getInstance |
| Configuration::purgeConfiguration | Configuration::destroyInstance() | | Application::sharedApplication |
Application::getInstance |
| Director::sharedDirector() |
Director::getInstance() |
| FileUtils::sharedFileUtils |
FileUtils::getInstance |
| FileUtils::purgeFileUtils |
FileUtils::destroyInstance |
| GLView::sharedOpenGLView |
GLView::getInstance |
| ShaderCache::sharedShaderCache |
ShaderCache::getInstance |
| ShaderCache::purgeSharedShaderCache |
ShaderCache::destroyInstance |
| AnimationCache::sharedAnimationCache |
AnimationCache::getInstance |
| AnimationCache::purgeSharedAnimationCache | AnimationCache::destroyInstance | | SpriteFrameCache::sharedSpriteFrameCache | SpriteFrameCache::getInstance | | SpriteFrameCache:: purgeSharedSpriteFrameCache| SpriteFrameCache::destroyInstance |
| NotificationCenter::sharedNotificationCenter | NotificationCenter::getInstance |
| NotificationCenter:: purgeNotificationCenter | NotificationCenter::destroyInstance|
| Profiler::sharedProfiler |
Profiler::getInstance |
| UserDefault::sharedUserDefault |
UserDefault::getInstance |
| UserDefault::purgeSharedUserDefault |
UserDefault::destroyInstance |
| v2.1 names | v3.0 names |
| ccc3() | Color3B() |
| ccc3BEqual() | Color3B::equals() |
| ccc4() | Color4B() |
| ccc4FFromccc3B() | Color4F() |
| ccc4f() | Color4F() |
| ccc4FFromccc4B() | Color4F() |
8、新的数据结构
> cocos2d::Map<>替代了CCDictionary
> cocos2d::Vector<>替代了CCArray
> cocos2d::Value替代了CCBool, CCFLoat, CCDouble